2012-08-25 122 views
1

我有一個非常大的數據集,我已經把它分割成50塊 所以基本上文件看起來像: 文件1 文件2 文件3 。 。 。 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個文件複製並粘貼到代碼中手動執行,但只是想知道是否有人可以修復我的代碼,只需點擊一下即可解決問題。

+0

是'file1','file2'等每個數據幀嗎? –

回答

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 
+0

甜,謝謝! – user1489597