1

非常に大きなデータ セットがあり、既に 50 個に分割しています。つまり、基本的にファイルは次のようになります。 file1 file2 file3 。. . file50 (データ フレーム)

file_total <- c(file1,...,file50)  

これがリストに結合されることはわかっていますがrbind、すべてのデータ全体が巨大で、plyr ライブラリの実行に永遠にかかるため、使用できません。

そして、各ファイルで、1 つの要因に基づいてそれらを分割し、「id」という名前を付けて、各 id サブセットを .csv ファイルに書き込むことができるようにする必要があります。

これまでのところ、私のコードは次のとおりです。

d_split <- split(file1, file1[1])

library(plry)
id <- unlist(lapply(d_split,"[",1,1)) # this returns the unique id

for (j in seq_along(id))
{ 
    write.csv(d_split[[j]], file=paste(id[j], "csv", sep="."))
}

これは動作します!!

しかし、別の for ループに入れようとすると機能しません。

for (i in file_total)
{
    d_split <- split(i, i[1])
    id <- unlist(lapply(d_split,"[",1,1)) 
    for (j in seq_along(id))
    {
        write.csv(d_split[[j]], file=paste(id[j], "csv", sep="."))
    }
}

次のエラー メッセージに戻ります。

Error in FUN(X[[1L]], ...) : incorrect number of dimensions

50 個のファイルをコピーしてコードに貼り付けることで手動で実行できることを意味していましたが、ワンクリックで解決できるように、誰かが私のコードを修正できるかどうか疑問に思っていました.

4

1 に答える 1

3

この問題は、データの結合方法に基づいて発生します。それらを で結合する代わりに、それらをcリストにします。

file_total <- list(file1,...,file50) 

この時点で、実行i in file_totalは必要に応じて繰り返されます。

説明として:cデータフレームで使用すると(私が想定しfile1file2いるように)、実際にはデータフレームのリストではなくベクトルのリストに変わります。例えば:

file1 = data.frame(x=1:20)
file2 = data.frame(y=20:40)
file_total = c(file1, file2)
# file_total will be:
# $x
#  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
#
# $y
#  [1] 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

したがって、それらを反復すると、実際には個々の列がベクトルとして反復されます。ただし、listそれらを結合するために使用すると、データ フレーム自体を反復処理できます。

> list(file1, file2)
[[1]]
    x
1   1
2   2
3   3
4   4
5   5
6   6
7   7
8   8
9   9
10 10
11 11
12 12
13 13
14 14
15 15
16 16
17 17
18 18
19 19
20 20

[[2]]
    y
1  20
2  21
3  22
4  23
5  24
6  25
7  26
8  27
9  28
10 29
11 30
12 31
13 32
14 33
15 34
16 35
17 36
18 37
19 38
20 39
21 40
于 2012-08-25T01:18:09.533 に答える