如何在R中写出具有不同文件名的多个文件

时间:2011-04-15 23:42:21

标签: r filenames multiple-tables

我有一个BIG文件(> 10000行数据),我想按ID写出一个单独的文件。我有50个唯一的ID名称,我希望每个名称都有一个单独的文本文件。这是我到目前为止所得到的,并且我一直在收到错误。我的ID实际上是字符串,如果我可以在该字符串之后命名每个文件,那么我更喜欢它。

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) 
}

2 个答案:

答案 0 :(得分:2)

一种方法是使用plyr包和d_ply()函数。 d_ply()期望将data.frame作为输入。您还提供了一个要切片的列,并将data.frame by切割为彼此独立操作。在这种情况下,您具有列ID。这个特定的函数不会返回一个对象,因此可以用于绘图或迭代制作章程等。这是一个小的工作示例:

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))

将生成三个制表符分隔文件,其中ID列为文件名(a.txt,b.txt,c.txt)。

编辑 - 解决后续问题

在将列传递到d_ply()之前,您始终可以对所需的列进行子集化。或者,您可以使用/滥用[运算符,并在通话中选择所需的列:

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))

答案 1 :(得分:2)

对于名为mtcars的数据框,由mtcars$cyl分隔:

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

这会生成带有相应数据的“4.txt”,“6.txt”,“8.txt”。这应该比循环/子集更快,因为子集化(分裂)是矢量化的。