3

次のコードを実行すると

data <- data.frame( A = c("foo", "foo", "bar", "bar"),
                    B = c("foo","bar", "foo", "bar"),
                    C = c("bla", "foo", "bla", "bar"),
                    D = c(1, 2, 3, 4 ),
                    E = c(5, 6, 7, 8 ))

ds <- split(data, list(data$A, data$B, data$C), drop=TRUE)
write.table(ds[1], file="foo.csv", append=FALSE, row.names=FALSE)

foo.csv は次のようになります。

 "bar.bar.bar.A","bar.bar.bar.B","bar.bar.bar.C","bar.bar.bar.D","bar.bar.bar.E"
 "bar","bar","bar",4,8

つまり、列名には、分割に使用された列の内容が含まれます。一般的な方法で名前を元の名前に戻すにはどうすればよいですか? (「A」、「B」などの列名を割り当てたくありません....)

4

1 に答える 1

3

の出力splitlist. ds[1]を返しますが、その最初のリスト項目内の値listを返します。ds[[1]]

例:

ds[1]
# $bar.bar.bar
#     A   B   C D E
# 4 bar bar bar 4 8

ds[[1]]
#     A   B   C D E
# 4 bar bar bar 4 8

出力を CSV ファイルとして適切に書き込むには、実際の を抽出する必要があるため、このアプローチdata.frameを使用する必要があります。ds[[1]]

write.table(ds[[1]], file="foo.csv", append=FALSE, row.names=FALSE)

data.frameすべての を個別の CSV ファイルに書きたい場合は、次のようにします。

lapply(names(ds), function(x) {
  write.table(ds[[x]], file = paste(x, ".csv", collapse = ""),
              append = FALSE, row.names = FALSE)
})

これにより、作業ディレクトリに 4 つの CSV ファイル (bar.bar.bar.csv、bar.foo.bla.csv、foo.foo.bla.csv、および foo.bar.foo.csv という名前) が作成されます。

于 2013-10-02T10:28:25.557 に答える