Hi, This question should be simple to answer. I am a new R user. I have a data.frame called appended. I would like to break it into 7 smaller datasets based on the value of a categorical variable dp (which has values 1:7). I would like to name the smaller datasets set1, set2, set3,....,set7. I don't know how to refer to the variable in the for loop, when naming the output datasets. In STATA (which I am much more familiar with) each i in the foreach loop would be refered to as `i'. This is the code I've included below. I've also tried set[[i]] and set[i] neither works. for (i in 1:7) { set`i' = appended[which(appended$dp==i & appended$sampled==0), ] write.table(set`i', file = "output\\set`i'.csv", sep = ",", row.name=F) } I'm assuming I just need to replace `' with something else but I can figure out what that something else is. -- View this message in context: http://r.789695.n4.nabble.com/use-variable-in-for-loop-to-name-output-files-tp4652711.html Sent from the R help mailing list archive at Nabble.com.
Hello, Try the following. set <- list() for (i in 1:7) { set[[i]] <- appended[which(appended$dp == i & appended$sampled == 0), ] fl <- paste0("output/set", i, ".csv") write.table(set[[i]], file = fl, sep = ",", row.name=F) } Hope this helps, Rui Barradas Em 10-12-2012 21:03, john-usace escreveu:> Hi, > > This question should be simple to answer. I am a new R user. > > I have a data.frame called appended. I would like to break it into 7 smaller > datasets based on the value of a categorical variable dp (which has values > 1:7). I would like to name the smaller datasets set1, set2, set3,....,set7. > I don't know how to refer to the variable in the for loop, when naming the > output datasets. In STATA (which I am much more familiar with) each i in the > foreach loop would be refered to as `i'. This is the code I've included > below. I've also tried set[[i]] and set[i] neither works. > > for (i in 1:7) { > set`i' = appended[which(appended$dp==i & appended$sampled==0), ] > write.table(set`i', file = "output\\set`i'.csv", sep = ",", row.name=F) > } > > I'm assuming I just need to replace `' with something else but I can figure > out what that something else is. > > > > -- > View this message in context: http://r.789695.n4.nabble.com/use-variable-in-for-loop-to-name-output-files-tp4652711.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 guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.
On Dec 10, 2012, at 1:03 PM, john-usace wrote:> Hi, > > This question should be simple to answer. I am a new R user. > > I have a data.frame called appended. I would like to break it into 7 > smaller > datasets based on the value of a categorical variable dp (which has > values > 1:7). I would like to name the smaller datasets set1, set2, > set3,....,set7. > I don't know how to refer to the variable in the for loop, when > naming the > output datasets. In STATA (which I am much more familiar with) each > i in the > foreach loop would be refered to as `i'. This is the code I've > included > below. I've also tried set[[i]] and set[i] neither works. > > for (i in 1:7) { > set`i' = appended[which(appended$dp==i & appended$sampled==0), ]I am not aware of any set function, nor can one append back-ticked characters to unquoted characters and expect anything useful to happen.> write.table(set`i', file = "output\\set`i'.csv", sep = ",", > row.name=F) > } > > I'm assuming I just need to replace `' with something else but I can > figure > out what that something else is. >In R the easy way would be to create a list that holds all of the split dataframes: newlist <- split( appended, catvar) names(newlist) <- paste0("set", 1:7) If you goal were just to have these in your workspace, you are done. If you goal is to write them out to a file then you can either save it as one object to be later pulled back into a session with the load(.) command using this: save(newlist, "newlist.Rdata") Or you can write each individually with lapply(names(newlist) , function(dfrm) { write.table(newlist[[dfrm]], file=paste0( dfrm, ".csv", sep=",", rowname=FALSE) } (Untested. You should read the help pages of the various functions mentioned.) -- David Winsemius, MD Alameda, CA, USA
If your final goal is to write the csv files, and only the csv files, then then this (not tested) should do it. for (i in unique(appended$dp) ) { tmp <- subset(appended, dp==i & sampled==0) write.table(tmp, file= file.path('output', paste0('set',i,'.csv')), sep=',', row.names=FALSE) } I threw in the use of file.path(); not necessary, but will make your scripts more cross-platform. And you don't actually have to create the 'tmp' data frame. You could do this inside the loop: write.table( subset(appended, dp==i & sampled==0), file= file.path('output', paste0('set',i,'.csv')), sep=',', row.names=FALSE) But I often find nested function calls harder to read. David and Rui both suggested storing the subsets in a list, and I agree. But if you really want objects named "set1", "set2", and so on in your workspace, so that you can reference them by those names, then you need the assign function. Experience will eventually give you some ideas of which way is better and when. The general recommendation is to avoid using assign(), and that's good advice. But I do occasionally find it useful. -Don -- Don MacQueen Lawrence Livermore National Laboratory 7000 East Ave., L-627 Livermore, CA 94550 925-423-1062 On 12/10/12 1:03 PM, "john-usace" <john.r.kucharski at usace.army.mil> wrote:>Hi, > >This question should be simple to answer. I am a new R user. > >I have a data.frame called appended. I would like to break it into 7 >smaller >datasets based on the value of a categorical variable dp (which has values >1:7). I would like to name the smaller datasets set1, set2, >set3,....,set7. >I don't know how to refer to the variable in the for loop, when naming the >output datasets. In STATA (which I am much more familiar with) each i in >the >foreach loop would be refered to as `i'. This is the code I've included >below. I've also tried set[[i]] and set[i] neither works. > >for (i in 1:7) { > set`i' = appended[which(appended$dp==i & appended$sampled==0), ] > write.table(set`i', file = "output\\set`i'.csv", sep = ",", row.name=F) > } > >I'm assuming I just need to replace `' with something else but I can >figure >out what that something else is. > > > >-- >View this message in context: >http://r.789695.n4.nabble.com/use-variable-in-for-loop-to-name-output-file >s-tp4652711.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 guide >http://www.R-project.org/posting-guide.html >and provide commented, minimal, self-contained, reproducible code.