大家好我正在处理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
展示我想要的内容。首先,我使用下一个代码将a5
与a4
,a1
,a2
和a3
合并:
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=TRUE
和Reduce()
的组合应用于merge()
的结果后得到。在将Final4
和listag
合并到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=TRUE
和Reduce()
的组合中添加另一个参数来获取我的结果,或者还有其他方法,例如使用来自merge()
的{{1}}或lapply
包裹超过llply
。全球的plyr
版本是下一个版本:
global
非常感谢你的帮助。
答案 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)