1

我有一个大文件(>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) 
}
4

2 回答 2

2

一种方法是使用 plyr 包和d_ply()函数。d_ply()需要一个 data.frame 作为输入。您还提供了一个列,您希望通过该列对 data.frame 进行切片和切块,以便彼此独立地进行操作。在这种情况下,您有列 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))
于 2011-04-16T00:41:15.820 回答
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”。这应该比循环/子集更快,因为子集(拆分)是矢量化的。

于 2011-04-16T03:28:41.040 回答