我有一个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)
}
答案 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”。这应该比循环/子集更快,因为子集化(分裂)是矢量化的。