合并大量data.frames [重复]

Posted

技术标签:

【中文标题】合并大量data.frames [重复]【英文标题】:Merging a lot of data.frames [duplicate] 【发布时间】:2012-12-15 07:55:59 【问题描述】:

可能重复:Merge multiple data frames in a list simultaneously

例如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 对于每个 data.frame 都是唯一的。我希望得到的矩阵看起来像

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 所说的补充。您可以构建 data.frames 列表:df_list 尽管此线程可能与另一个线程重复,但问题和答案都以更易读的方式呈现。 【参考方案1】:

将它们放入list 并使用mergeReduce

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))

【讨论】:

+1 表示Reduce。对于这个简单的示例,这相当于merge(merge(df1, df2, by='id', all=T), df3, by='id', all=T)。显然可以使用循环,遍历数据帧——但这正是Reduce 所做的。 我很感谢 Reduce 在语言中,但我真的希望它更像 *apply 函数,让您为提供的函数提供额外的参数。我讨厌我必须嵌入一个函数定义才能将mergeall=TRUE 一起使用。 merge_recursemerge_all 来自(较旧的)reshape 包,它们是一个不错的指南,可以帮助您以更方便的形式为您构建一些东西。 如果我们必须在这些数据帧中考虑不同的ids,请问如何修改函数? 我试过这个方法,它真的很慢,有 500 个列表,每个列表有 125 行。有没有其他快速的方法

以上是关于合并大量data.frames [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在过滤R data.frames时更新因子水平[重复]

data.frames 列表的快速矢量化合并

从列表中合并并平均每15个data.frames

使用熊猫循环合并大量csv文件[重复]

R - 子集列表data.frames由矢量值

如何合并具有不同列号的两个表,同时删除具有大量列的表的重复项