在单个数据帧和一个数据帧列表中应用R中的不同结果

时间:2013-12-29 00:41:00

标签: r lapply

大家好我正在处理R中的数据框列表,我想逐个合并它们。我发现一个解决方案是使用Reduce()函数与merge(),但是当我逐个合并数据帧时,我得不到相同的结果。我的数据框列表是global,它有下一个结构(我在最后部分包含dput()版本的列表):

global
$a1
   ID Value Products z1
1 001     1        3  1
2 002     2        2  1
3 003     3        0  1
4 004     4        1  1
5 005     5        1  1
6 006     6        6  1
7 007     7        7  1
8 009     8        1  1
9 010     9        1  1

$a2
    ID Value Products z2
1  001     1        3  2
2  002     2        2  2
3  003     3        0  2
4  004     4        1  2
5  005     5        1  2
6  006     6        6  2
7  011    10        5  2
8  012    11        5  2
9  007     7        7  2
10 009     8        1  2
11 010     9        1  2

$a3
    ID Value Products z3
1  001     1        3  3
2  002     2        2  3
3  012    11        5  3
4  013    11        1  3
5  014    11        2  3
6  003     3        0  3
7  004     4        1  3
8  005     5        1  3
9  006     6        6  3
10 007     7        7  3
11 009     8        1  3
12 010     9        1  3
13 011    10        5  3

$a4
    ID Value Products z4
1  001     1        3  4
2  002     2        2  4
3  012    11        5  4
4  013    11        1  4
5  014    11        2  4
6  003     3        0  4
7  004     4        1  4
8  005     5        1  4
9  006     6        6  4
10 007     7        7  4
11 009     8        1  4
12 010     9        1  4
13 011    10        5  4
14 015    12        3  4
15 016    12        3  4

$a5
    ID Value Products z5
1  001     1        3  5
2  002     2        2  5
3  003     3        0  5
4  004     4        1  5
5  016    12        3  5
6  017    14        2  5
7  005     5        1  5
8  006     6        6  5
9  007     7        7  5
10 009     8        1  5
11 010     9        1  5
12 011    10        5  5
13 012    11        5  5
14 013    11        1  5
15 014    11        2  5
16 015    12        3  5
17 018    14        2  5

我正在将所有数据框与global中之前的数据框合并,为此,我使用下一个代码创建了一个名为listag的新列表:

listag=Reduce(function(x, y) merge(x,y[,c(1,4)],by=intersect(names(x)[1],names(y)[1]),all.x=TRUE),global,accumulate=TRUE)

我在all.x=TRUE中使用了参数merge(),因为我希望在每个数据框中保留其原始行数(a1 = 9,a2 = 11,{ {1}} = 13,a3 = 15,a4 = 17)。在此之后,我在单个数据框中分隔a5以检查最后一个代码是否正常工作,我发现了差异。为了分隔数据帧,我使用了这段代码:

global

我得到了五个数据框。现在,我将使用数据框list2env(global, envir=.GlobalEnv) a4展示我想要的内容。首先,我使用下一个代码将a5a4a1a2a3合并:

a4

此代码的结果是:

Final41=merge(a4,a1[,c(1,4)],by=intersect(names(a4)[1],names(a1)[1]),all.x=TRUE)
Final42=merge(Final41,a2[,c(1,4)],by=intersect(names(Final41)[1],names(a2)[1]),all.x=TRUE)
Final43=merge(Final42,a3[,c(1,4)],by=intersect(names(Final42)[1],names(a3)[1]),all.x=TRUE)
Final4=merge(Final43,a4[,c(1,4)],by=intersect(names(Final43)[1],names(a4)[1]),all.x=TRUE)

论证Final4 ID Value Products z4.x z1 z2 z3 z4.y 1 001 1 3 4 1 2 3 4 2 002 2 2 4 1 2 3 4 3 003 3 0 4 1 2 3 4 4 004 4 1 4 1 2 3 4 5 005 5 1 4 1 2 3 4 6 006 6 6 4 1 2 3 4 7 007 7 7 4 1 2 3 4 8 009 8 1 4 1 2 3 4 9 010 9 1 4 1 2 3 4 10 011 10 5 4 NA 2 3 4 11 012 11 5 4 NA 2 3 4 12 013 11 1 4 NA NA 3 4 13 014 11 2 4 NA NA 3 4 14 015 12 3 4 NA NA NA 4 15 016 12 3 4 NA NA NA 4 工作正常,因为我保留了all.x=TRUE(15)中的原始观察数。当我提取a4的第4个元素时,我得到了这个:

listag

对于f4l=listag[[4]] f4l ID Value Products z1 z2 z3 z4 1 001 1 3 1 2 3 4 2 002 2 2 1 2 3 4 3 003 3 0 1 2 3 4 4 004 4 1 1 2 3 4 5 005 5 1 1 2 3 4 6 006 6 6 1 2 3 4 7 007 7 7 1 2 3 4 8 009 8 1 1 2 3 4 9 010 9 1 1 2 3 4 函数中的merge()我也在考虑Reduce(),但我没有得到相同的结果,并且观察的数量是错误的。我希望将all.x=TRUEReduce()的组合应用于merge()的结果后得到。在将Final4listag合并到Reduce()后,merge()的其他数据框也是如此。我想为global中的每个数据帧得到这个结果(在这种情况下,它将是第4个数据帧):

listag

当我合并 ID Value Products z1 z2 z3 z4 1 001 1 3 1 2 3 4 2 002 2 2 1 2 3 4 3 003 3 0 1 2 3 4 4 004 4 1 1 2 3 4 5 005 5 1 1 2 3 4 6 006 6 6 1 2 3 4 7 007 7 7 1 2 3 4 8 009 8 1 1 2 3 4 9 010 9 1 1 2 3 4 10 011 10 5 NA 2 3 4 11 012 11 5 NA 2 3 4 12 013 11 1 NA NA 3 4 13 014 11 2 NA NA 3 4 14 015 12 3 NA NA NA 4 15 016 12 3 NA NA NA 4 Reduce()时,我不知道代码中有什么问题。当我逐个合并数据帧时,我正在考虑merge()相等。你能帮我解决这个问题吗?也许我必须在all.x=TRUEReduce()的组合中添加另一个参数来获取我的结果,或者还有其他方法,例如使用来自merge()的{​​{1}}或lapply包裹超过llply。全球的plyr版本是下一个版本:

global

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

有几件事:

*首先,您的缩减合并和手动合并*通常会给出不同的结果,因为它们不是以相同的顺序执行的。 Reduce进程1:4,由于我不太明白的原因,在你的手册中合并你的表演4,1,2,3,4。

其次,您观察到的差异是a4表具有其他ID,并且它们在Reduced merge中丢失,因为您使用all.x = TRUE,但a4表作为“y”表。所以你应该使用all = TRUE代替:

listag <- Reduce(function(x, y) merge(x, y[, c(1, 4)],
          by = intersect(names(x)[1], names(y)[1]), all = TRUE), global)