如何合并列表中的数据帧子集(即,合并来自每个列表组件的所有第一个dfs)

时间:2016-09-24 17:28:41

标签: r list merge

当每个列表元素是单个数据帧时,我已经看到了如何从列表中合并数据帧的一些答案。但是,在我的例子中,每个列表元素包含两个数据帧。我想合并所有第一个和所有第二个。作为一个虚拟的例子:

<span class="centered-span">Hey there (not centered)</span>

<div class="centered-span">
  <span>Hey there - span</span>
<div>
  
<div class="centered-div">Hey there - div</div>

我想将第一个元素和第二个元素合并在一起,以产生两个数据框:

lst<-list()
lst[[1]]<-list(data.frame(cat=c(1:5), type=c(11:15)), data.frame(group=c("A","B","C"), num=c(1:3)))
lst[[2]]<-list(data.frame(cat=c(22:26), type=c(50:54)), data.frame(group=c("H","I","J"), num=c(7:9)))

我确信有一些简单的方法可以做到这一点(以某种方式使用do.call和rbind ??)但我无法弄清楚如何正确引用每个列表中的各种元素。

显然,通过这个小例子,我可以通过以下方式手动完成:

df1:
cat type
1   1   11
2   2   12
3   3   13
4   4   14
5   5   15
6  22   50
7  23   51
8  24   52
9  25   53
10  26   54

df2:
group num
1     A   1
2     B   2
3     C   3
4     H   7
5     I   8
6     J   9

但是,我的实际列表包含数百个数据帧。我可以通过创建循环并按顺序一次一个地进行循环来实现,但我确信有更有效的方法...感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您可以使用Reduce功能(您可以自定义reduce的方式)到rbind数据框。 Reduce每次从列表中获取两个元素,并根据您的函数将其减少为一个元素;对于自定义rbind,因为每两个数据帧需要单独绑定,您可以使用{{1}把它们放在一起:

Map

或者更快的方式:

Reduce(function(x, y) Map(rbind, x, y), lst)

# [[1]]
#    cat type
# 1    1   11
# 2    2   12
# 3    3   13
# 4    4   14
# 5    5   15
# 6   22   50
# 7   23   51
# 8   24   52
# 9   25   53
# 10  26   54

# [[2]]
#   group num
# 1     A   1
# 2     B   2
# 3     C   3
# 4     H   7
# 5     I   8
# 6     J   9