hello gurus, i have a data frame like this HTN HTN_FDR Dyslipidemia CAD t1d_ptype[1:25] 1 Y Y Y T1D 2 T1D 3 Ctrl_FDR 4 T1D 5 Y Ctrl 6 Ctrl 7 Ctrl_FDR 8 T1D 9 Y Y T1D 10 T1D 11 Ctrl_FDR 12 Y Y T1D 13 Y Y Y T1D 14 T1D 15 Ctrl 16 Ctrl 17 Ctrl_FDR 18 T1D 19 T1D 20 Y T1D 21 Ctrl_FDR 22 Ctrl_FDR 23 Ctrl 24 Ctrl 25 T1D i am converting it to define the groups more uniformly using this code: for( i in 1:dim(c1)[1]) { num_comp<-0 for (j in 1:dim(c1)[2]) if (c1[i,j]==2) num_comp=num_comp+1 #"Y"=2 for (j in 1:dim(c1)[2]) if(num_comp>0) { if (data$t1d_ptype[i] == "T1D" && c1[i ,j] == 2) c2[i,j]<-"T1D_w" if (data$t1d_ptype[i] == "T1D" && c1[i, j] == 1) c2[i,j]<-"T1D_oc" if(substr(data$t1d_ptype[i],1,4) == "Ctrl" && c1[i,j] == 2) c2[i,j]<-"Ctrl_w" if (substr(data$t1d_ptype[i],1,4) == "Ctrl" && c1[i,j] == 1) c2[i,j]<-"Ctrl_oc" } else { if(data$t1d_ptype[i] == "T1D") c2[i,j]<-"T1D_noc" if(substr(data$t1d_ptype[i],1,4) == "Ctrl") c2[i,j]<-"Ctrl_noc" } } it is giving me error In `[<-.factor`(`*tmp*`, iseq, value = structure(c(NA, ... : invalid factor level, NAs generated Also it there a simple way to do this. Thanks Sharad -- View this message in context: http://r.789695.n4.nabble.com/Help-with-code-tp4218989p4218989.html Sent from the R help mailing list archive at Nabble.com.
the short answer... which is a guess cause you didn't provide a reproducible example... is: your column (i think its called t1d_ptype[1:25]) is a factor and using factors is dangerous at best. you can check with ?str. see ?factor for how to convert back to strings and see if your code works. to answer your second question, yes I'm sure there is a better simple way to do this, but i can't follow what you're doing... for example, I don't know what c1 is... but, the place I would look is at the plyr package. its excellent at splitting and reordering data. and one final note, you should avoid naming things with pre-existing R functions (e.g. data). Justin On Tue, Dec 20, 2011 at 11:14 AM, 1Rnwb <sbpurohit@gmail.com> wrote:> hello gurus, > > i have a data frame like this > HTN HTN_FDR Dyslipidemia CAD t1d_ptype[1:25] > 1 Y Y Y T1D > 2 T1D > 3 Ctrl_FDR > 4 T1D > 5 Y Ctrl > 6 Ctrl > 7 Ctrl_FDR > 8 T1D > 9 Y Y T1D > 10 T1D > 11 Ctrl_FDR > 12 Y Y T1D > 13 Y Y Y T1D > 14 T1D > 15 Ctrl > 16 Ctrl > 17 Ctrl_FDR > 18 T1D > 19 T1D > 20 Y T1D > 21 Ctrl_FDR > 22 Ctrl_FDR > 23 Ctrl > 24 Ctrl > 25 T1D > > i am converting it to define the groups more uniformly using this code: > > for( i in 1:dim(c1)[1]) > { > num_comp<-0 > for (j in 1:dim(c1)[2]) > if (c1[i,j]==2) num_comp=num_comp+1 #"Y"=2 > for (j in 1:dim(c1)[2]) > if(num_comp>0) > { > if (data$t1d_ptype[i] == "T1D" && c1[i ,j] == 2) c2[i,j]<-"T1D_w" > if (data$t1d_ptype[i] == "T1D" && c1[i, j] == 1) c2[i,j]<-"T1D_oc" > if(substr(data$t1d_ptype[i],1,4) == "Ctrl" && c1[i,j] == 2) > c2[i,j]<-"Ctrl_w" > if (substr(data$t1d_ptype[i],1,4) == "Ctrl" && c1[i,j] == 1) > c2[i,j]<-"Ctrl_oc" > } > else > { > if(data$t1d_ptype[i] == "T1D") c2[i,j]<-"T1D_noc" > if(substr(data$t1d_ptype[i],1,4) == "Ctrl") c2[i,j]<-"Ctrl_noc" > } > } > > it is giving me error > In `[<-.factor`(`*tmp*`, iseq, value = structure(c(NA, ... : > invalid factor level, NAs generated > > Also it there a simple way to do this. > Thanks > Sharad > > -- > View this message in context: > http://r.789695.n4.nabble.com/Help-with-code-tp4218989p4218989.html > Sent from the R help mailing list archive at Nabble.com. > > ______________________________________________ > R-help@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide > http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >[[alternative HTML version deleted]]
Hi> > hello gurus, > > i have a data frame like this > HTN HTN_FDR Dyslipidemia CAD t1d_ptype[1:25] > 1 Y Y Y T1D > 2 T1D > 3 Ctrl_FDR > 4 T1D > 5 Y Ctrl > 6 Ctrl > 7 Ctrl_FDR > 8 T1D > 9 Y Y T1D > 10 T1D > 11 Ctrl_FDR > 12 Y Y T1D > 13 Y Y Y T1D > 14 T1D > 15 Ctrl > 16 Ctrl > 17 Ctrl_FDR > 18 T1D > 19 T1D > 20 Y T1D > 21 Ctrl_FDR > 22 Ctrl_FDR > 23 Ctrl > 24 Ctrl > 25 T1D > > i am converting it to define the groups more uniformly using this code: > > for( i in 1:dim(c1)[1]) > { > num_comp<-0 > for (j in 1:dim(c1)[2]) > if (c1[i,j]==2) num_comp=num_comp+1 #"Y"=2 > for (j in 1:dim(c1)[2]) > if(num_comp>0) > { > if (data$t1d_ptype[i] == "T1D" && c1[i ,j] == 2) c2[i,j]<-"T1D_w" > if (data$t1d_ptype[i] == "T1D" && c1[i, j] == 1)c2[i,j]<-"T1D_oc"> if(substr(data$t1d_ptype[i],1,4) == "Ctrl" && c1[i,j] == 2) > c2[i,j]<-"Ctrl_w" > if (substr(data$t1d_ptype[i],1,4) == "Ctrl" && c1[i,j] == 1) > c2[i,j]<-"Ctrl_oc" > } > else > { > if(data$t1d_ptype[i] == "T1D") c2[i,j]<-"T1D_noc" > if(substr(data$t1d_ptype[i],1,4) == "Ctrl") c2[i,j]<-"Ctrl_noc" > } > } > > it is giving me error > In `[<-.factor`(`*tmp*`, iseq, value = structure(c(NA, ... : > invalid factor level, NAs generated > > Also it there a simple way to do this.To do what? The only error i get is Error: object 'c1' not found You probably named your data frame c1 but I do not see any numbers in c1 With your programming style you shall probably use C+ or similar. In R it is almost always better to operate on whole objects. Without knowing what you want to achive and without any data I can only suggest to look at ?factor ?interaction Regards Petr> Thanks > Sharad > > -- > View this message in context: http://r.789695.n4.nabble.com/Help-with- > code-tp4218989p4218989.html > Sent from the R help mailing list archive at Nabble.com. > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guidehttp://www.R-project.org/posting-guide.html> and provide commented, minimal, self-contained, reproducible code.
here is the dump and the code once again, sorry for creating so much noise. c1<-structure(list(HTN = structure(c(2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("", "Y"), class = "factor"), HTN_FDR = structure(c(2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L), .Label = c("", "Y"), class = "factor"), Dyslipidemia = structure(c(2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("", "Y"), class = "factor"), CAD = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("", "Y"), class "factor"), CAD_FDR = structure(c(2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("", "Y"), class = "factor"), Prior_MI = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("", "Y"), class "factor"), t1d_ptype = structure(c(3L, 3L, 2L, 3L, 1L, 1L, 2L, 3L, 3L, 3L, 2L, 3L, 3L, 3L, 1L, 1L, 2L, 3L, 3L, 3L, 2L, 2L, 1L, 1L, 3L), .Label = c("Ctrl", "Ctrl_FDR", "T1D"), class = "factor")), .Names c("HTN", "HTN_FDR", "Dyslipidemia", "CAD", "CAD_FDR", "Prior_MI", "t1d_ptype" ), row.names = c(NA, 25L), class = "data.frame") c2<-c1 any_comp<-NULL for( i in 1:dim(c1)[1]) { num_comp<-0 for (j in 1:dim(c1)[2]) if (c1[i,j]==2) num_comp=num_comp+1 #"Y"=2 for (j in 1:dim(c1)[2]) if(num_comp>0) { if (data$t1d_ptype[i] == "T1D" && c1[i ,j] == 2) c2[i,j]<-"T1D_w" if (data$t1d_ptype[i] == "T1D" && c1[i, j] == 1) c2[i,j]<-"T1D_oc" if(substr(data$t1d_ptype[i],1,4) == "Ctrl" && c1[i,j] == 2) c2[i,j]<-"Ctrl_w" if (substr(data$t1d_ptype[i],1,4) == "Ctrl" && c1[i,j] == 1) c2[i,j]<-"Ctrl_oc" } else { if(data$t1d_ptype[i] == "T1D") c2[i,j]<-"T1D_noc" if(substr(data$t1d_ptype[i],1,4) == "Ctrl") c2[i,j]<-"Ctrl_noc" } } -- View this message in context: http://r.789695.n4.nabble.com/Help-with-code-tp4218989p4222965.html Sent from the R help mailing list archive at Nabble.com.
Hello, There are so many people posting answers that I'm curious and decided to try one. I don't know if this is it but it doesn't give an error and it reformats your data according to the rules in your original code. # nr <- dim(c1)[1] nc <- dim(c1)[2] c2 <- NULL c2_row <- rep("", nc-1) for(i in 1:nr){ ptype <- as.character(c1$t1d_ptype[i]) stype <- substr(ptype,1,4) num_comp <- sum(c1[i,] == "Y") for(j in 1:(nc-1)){ c2_row[j] <- "" if(num_comp > 0){ c1_tmp <- as.integer(c1[i ,j]) if(ptype == "T1D"){ if(c1_tmp == 1) c2_row[j] <- "T1D_oc" if(c1_tmp == 2) c2_row[j] <- "T1D_w" } if(stype == "Ctrl"){ if(c1_tmp == 1) c2_row[j] <- "Ctrl_oc" if(c1_tmp == 2) c2_row[j] <- "Ctrl_w" } } else{ if(ptype == "T1D") c2_row[j] <- "T1D_noc" if(stype == "Ctrl") c2_row[j] <- "Ctrl_noc" } } c2 <- rbind(c2, c(c2_row, ptype)) } c2 <- data.frame(c2) colnames(c2) <- colnames(c1) c2 I bet there's a way to work on entire objects. This is C-like. Rui Barradas -- View this message in context: http://r.789695.n4.nabble.com/Help-with-code-tp4218989p4229987.html Sent from the R help mailing list archive at Nabble.com.
Hi Can you explain rules for propagating values? I do not see any pattern. Only when there is no Y in a line you want to fill all columns with either T1D_noc or Ctrl_noc based on t1d_ptype. I would start with narrowing the levels in last column as it seems to me there is no difference between Ctrl and Ctrl_FDR in desired result levels(c1$t1d_ptype)[1:2] <- "Ctrl" If you want to retain old values just make a new column with t1d_ptype and change levels only in this new column. select all rows without Y selection<-which(rowSums(c1[,1:6]=="")==6) change columns 1:6 to character instead of factors c1[,1:6]<-sapply(c2[,1:6], as.character) put values from last column to other columns and add "noc" c1[selection,1:6]<-paste(c1[selection,7], "noc", sep="_") and after that I am lost. Petr> > structure(list(HTN = 1:10, HTN_FDR = structure(c(4L, 2L, 1L, > 2L, 3L, 1L, 1L, 2L, 3L, 2L), .Label = c("Ctrl_noc", "T1D_noc", > "T1D_oc", "T1d_w"), class = "factor"), Dyslipidemia = structure(c(3L, > 2L, 1L, 2L, 4L, 1L, 1L, 2L, 4L, 2L), .Label = c("Ctrl_noc", "T1D_noc", > "T1D_oc", "T1D_w"), class = "factor"), CAD = structure(c(3L, > 2L, 1L, 2L, 3L, 1L, 1L, 2L, 3L, 2L), .Label = c("Ctrl_noc", "T1D_noc", > "T1D_oc"), class = "factor"), CAD_FDR = structure(c(3L, 2L, 1L, > 2L, 3L, 1L, 1L, 2L, 3L, 2L), .Label = c("Ctrl_noc", "T1D_noc", > "T1D_oc"), class = "factor"), Prior_MI = structure(c(3L, 2L, > 1L, 2L, 3L, 1L, 1L, 2L, 3L, 2L), .Label = c("Ctrl_noc", "T1D_noc", > "T1D_oc"), class = "factor"), t1d_ptype = structure(c(3L, 3L, > 2L, 3L, 1L, 1L, 2L, 3L, 3L, 3L), .Label = c("Ctrl", "Ctrl_FDR", > "T1D"), class = "factor")), .Names = c("HTN", "HTN_FDR", "Dyslipidemia",> "CAD", "CAD_FDR", "Prior_MI", "t1d_ptype"), class = "data.frame",row.names> = c(NA, > -10L)) > > > -- > View this message in context: http://r.789695.n4.nabble.com/Help-with- > code-tp4218989p4228759.html > Sent from the R help mailing list archive at Nabble.com. > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guidehttp://www.R-project.org/posting-guide.html> and provide commented, minimal, self-contained, reproducible code.