基于列输出数据帧子集的有效方法

时间:2012-11-29 15:58:07

标签: r

使用

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循环的情况下完成工作,那我很好奇。

谢谢!

2 个答案:

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

使用splitMap是一种选择。

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)
)
相关问题