1

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循环的情况下完成这项工作。

谢谢!

4

2 回答 2

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是当您需要“增长”一个您事先无法知道其大小的数据结构时。

于 2012-11-29T16:13:56.130 回答
3

使用splitandMap是一种选择。

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)
)
于 2012-11-29T16:19:07.537 回答