使用
df <- data.frame(week = rep(1:7, each = 2), value = round(rnorm(14), 2))
我想将df
写入7(取决于week
列)单独的文件,每周作为单个文件。例如:
1.tsv
1 0.49
1 1.04
2.tsv
2 0.40
2 0.97
...
7.tsv
7 -0.03
7 0.52
我想出了这个:
for (wk in unique(df$week)) {
write.table(df[df$week == wk, ]
, file = paste(wk, ".tsv", sep = "")
, sep = "\t", row.names = F, col.names = F, quote = F)
}
但是如果有更好的方法可以在不使用for
循环的情况下完成工作,那我很好奇。
谢谢!
答案 0 :(得分:3)
您通常可以在函数中使用for
循环中使用的相同构造,并与apply
系列之一结合使用:
myfun <- function(wk) {
write.table(df[df$week == wk, ]
, file = paste(wk, ".tsv", sep = "")
, sep = "\t", row.names = F, col.names = F, quote = F)
}
lapply(unique(df$week), myfun)
但是,为清楚起见,我认为for
循环选项更好。而且,对于这样的操作,两者的速度将非常相似。 apply
系列的真正优势在于,您需要“增长”一个您手头无法知道的数据结构。
答案 1 :(得分:3)
使用split
和Map
是一种选择。
df.split <- split(df, df$week)
invisible( # hide Map return value, just a list of NULLs.
Map(write.table, x=df.split, file=paste(names(df.split), "tsv", sep="."),
row.names=F, col.names=F, quote=F)
)