在for循环中拆分数据框列表(维度上的错误)

时间:2012-08-25 01:08:50

标签: r

我有一个非常大的数据集,我已经将它分成了50个 所以基本上文件看起来像: 文件1 文件2 文件3 。 。 。 file50(数据框)

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

我知道这会把它合并到一个列表中,但我不能使用rbind,因为整个所有数据都很庞大,而ply​​r库只需要永远运行

在每个文件中,我必须根据1个因素对它们进行拆分,将其命名为&#34; id&#34;,然后能够将每个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个文件粘贴到代码中来手动完成,但只是想知道是否有人可以修复我的代码,以便一次点击就可以解决它。

1 个答案:

答案 0 :(得分: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