合并大量数据框

88

可能是重复问题:
如何同时合并包含在列表中的多个数据框(data.frames)


data.frames 示例:

 df1 = data.frame(id=c('1','73','2','10','43'),v1=c(1,2,3,4,5)) <br>
 df2 = data.frame(id=c('7','23','57','2','62','96'),v2=c(1,2,3,4,5,6)) <br>
 df3 = data.frame(id=c('23','62'),v3=c(1,2)) <br>
注意:id 对于每一个数据框是唯一的。我希望生成的矩阵看起来像这样:
1      1 NA NA 
2      3  4 NA 
7      NA 1 NA 
10     4 NA NA 
23     NA 2  1 
43     5 NA NA 
57     NA 3 NA 
62     NA 5  2 
73     2 NA NA 
96     NA 6 NA

在这种情况下,我只展示了3个数据集,实际上我至少有22个数据集,因此最终我想要一个nx(22+1)的矩阵,其中n是所有22个数据集的id数量。

给定2个数据集,我需要在第一列中获取它们的ids,第二列和第三列填充值,如果不存在值,则输入NA


这不是一个解决方案,但是补充一下@Matthew Plourde所说的。您可以构建数据框列表:df_list <- lapply(paste0("df",1:22), as.name)。 - Wojciech Sobala
1
尽管这个线程可能是另一个线程的副本,但是两个问题和答案都以更易读的方式呈现。 - biocyberman
1个回答

203
将它们放入一个列表中,使用带有Reduce的merge。
Reduce(function(x, y) merge(x, y, all=TRUE), list(df1, df2, df3))
#    id v1 v2 v3
# 1   1  1 NA NA
# 2  10  4 NA NA
# 3   2  3  4 NA
# 4  43  5 NA NA
# 5  73  2 NA NA
# 6  23 NA  2  1
# 7  57 NA  3 NA
# 8  62 NA  5  2
# 9   7 NA  1 NA
# 10 96 NA  6 NA

你也可以使用这个更加简洁的版本:

Reduce(function(...) merge(..., all=TRUE), list(df1, df2, df3))

13
+1 for Reduce。对于这个简单的例子来说,这相当于 merge(merge(df1, df2, by='id', all=T), df3, by='id', all=T)。显然可以使用循环遍历数据框 - 但这正是 Reduce 所做的。 - Matthew Lundberg
4
我很感激语言中有Reduce函数,但我真的希望它更像*apply函数,让你能够为提供的函数提供额外的参数。我不喜欢只是为了在merge时使用all=TRUE而嵌入一个函数定义。 - Matthew Plourde
2
merge_recursemerge_all 是(旧版本的)reshape包中构建类似功能更便捷的工具的不错指南。 - joran
3
我可以问一下,如果我们需要考虑这些数据框中不同的“ids”,如何修改函数? - Konrad
4
我尝试了这种方法,但在包含500个列表、每个列表有125行的情况下速度非常缓慢。还有其他更快的方法吗? - Polla A. Fattah
显示剩余12条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接