1

df <- data.frame(week = rep(1:7, each = 2), value = round(rnorm(14), 2))

各週を 1 つのファイルとしてdf7 つの (列に応じて) 個別のファイルに書き出したいと考えています。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の 1 つと組み合わせることができます。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ただし、明確にするために、ループオプションの方が優れていると思います。また、このような操作では、2 つの速度は非常に似ています。ファミリの真の利点は、apply事前にサイズを知ることができないデータ構造を「拡張」する必要がある場合です。

于 2012-11-29T16:13:56.130 に答える
3

splitとの使用Mapは 1 つのオプションです。

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 に答える