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) 

此时,doingi in file_total将按照您的意愿进行迭代。

作为解释:使用c数据帧(正如我假设file1的那样file2)实际上会将它们变成向量列表而不是数据帧列表。例如:

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 回答