开发者

How can I write out multiple files with different filenames in R

I have one BIG file (>10000 lines of data) an开发者_运维问答d I want write out a separate file by ID. I have 50 unique ID names and I want a separate text file for each one. Here's what Ive got so far, and I keep getting errors. My ID is actually character string which I would prefer if I can name each file after that character string it would be best.

for (i in 1:car$ID) {
    a <- data.frame(car[,i])
    carib <- car1[,(c("x","y","time","sd"))]
    myfile <- gsub("( )", "", paste("C:/bridge", carib, "_", i, ".txt"))
    write.table(a, file=myfile,
                sep="", row.names=F, col.names=T quote=FALSE, append=FALSE) 
}


One approach would be to use the plyr package and the d_ply() function. d_ply() expects a data.frame as an input. You also provide a column(s) that you want to slice and dice that data.frame by to operate on independently of one another. In this case, you have the column ID. This specific function does not return an object, and is thus useful for plotting, or making charter iteratively, etc. Here's a small working example:

library(plyr)

dat <- data.frame(ID = rep(letters[1:3],2) , x = rnorm(6), y = rnorm(6))

d_ply(dat, "ID", function(x)
     write.table(x, file = paste(x$ID[1], "txt", sep = "."), sep = "\t", row.names = FALSE))

Will generate three tab separates files with the ID column as the name of the files (a.txt, b.txt, c.txt).

EDIT - to address follow up question

You could always subset the columns you want before passing it into d_ply(). Alternatively, you can use/abuse the [ operator and select the columns you want within the call itself:

dat <- data.frame(ID = rep(letters[1:3],2) , x = rnorm(6), y = rnorm(6)
  , foo = rnorm(6))

d_ply(dat, "ID", function(x)
     write.table(x[, c("x", "foo")], file = paste(x$ID[1], "txt", sep = ".")
     , sep = "\t", row.names = FALSE))


For the data frame called mtcars separated by mtcars$cyl:

lapply(split(mtcars, mtcars$cyl), 
   function(x)write.table(x, file = paste(x$cyl[1], ".txt", sep = "")))

This produces "4.txt", "6.txt", "8.txt" with the corresponding data. This should be faster than looping/subsetting since the subsetting (splitting) is vectorized.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜