当每个列表元素是单个数据帧时,我已经看到了如何从列表中合并数据帧的一些答案。但是,在我的例子中,每个列表元素包含两个数据帧。我想合并所有第一个和所有第二个。作为一个虚拟的例子:
<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
但是,我的实际列表包含数百个数据帧。我可以通过创建循环并按顺序一次一个地进行循环来实现,但我确信有更有效的方法...感谢您的帮助!
答案 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