将列表中的data.frames堆叠到单个data.frame中,将名称(列表)保存为额外列

时间:2014-03-14 13:59:36

标签: r dataframe plyr

我有一个数据框列表,我想将它们组合成一个data.frame。这就是我的列表:

my_list <- list(
    m=data.frame(a = letters[1:5], b = 1:5, c = rnorm(5)), 
    n=data.frame(a = letters[1:5], b = 6:10, c = rnorm(5)))

> my_list
$m
  a b          c 
1 a 1  0.1151720  
2 b 2 -0.3785748  
3 c 3 -0.1446305  
4 d 4 -0.4300272  
5 e 5  1.1982312  

$n
  a  b          c 
1 a  6  1.2079439 
2 b  7 -1.2414251 
3 c  8  0.4362390 
4 d  9 -0.5844525 
5 e 10  0.1420070 

我希望将它们叠加在一起,但不会丢失data.frame名称的上下文(&#34; m&#34;,&#34; n&#34;) 。理想情况下,原始数据帧的名称将作为额外列包含在最终数据帧中。一种方法是在使用rbind.fill之前添加额外的列:

for(i in 1:length(my_list)) my_list[[i]][, 4] <- names(my_list)[i]
library(plyr)
rbind.fill(my_list)

   a  b          c V4
1  a  1  0.1151720  m
2  b  2 -0.3785748  m
3  c  3 -0.1446305  m
4  d  4 -0.4300272  m
5  e  5  1.1982312  m
6  a  6  1.2079439  n
7  b  7 -1.2414251  n
8  c  8  0.4362390  n
9  d  9 -0.5844525  n
10 e 10  0.1420070  n    

我不喜欢的是我必须注意数据框的尺寸和额外列的名称。

那里有没有更好的功能,以更灵活和通用的方式做到这一点?

3 个答案:

答案 0 :(得分:3)

另一种可能性:

library(plyr)
ldply(my_list)
#    .id a  b          c
# 1    m a  1 -0.1294107
# 2    m b  2  0.8867361
# 3    m c  3 -0.1513960
# 4    m d  4  0.3297912
# 5    m e  5 -3.2273228
# 6    n a  6 -0.7717918
# 7    n b  7  0.2865486
# 8    n c  8 -1.2205120
# 9    n d  9  0.4345504
# 10   n e 10  0.8001769

答案 1 :(得分:1)

您可以使用另一种寻址方式来解决这两个问题:

for(i in 1:length(my_list)) my_list[[i]]$names <- names(my_list)[i]

或者,避免循环(更惯用的R,恕我直言):

lapply(names(my_list), function (n) cbind(my_list[[n]], names = n))

顺便说一句,此处不需要plyr,可以通过

实现相同的效果
do.call(rbind, my_list)

答案 2 :(得分:1)

这让我很生气,因为它很容易做到,但我只是想要一个方便的方法来做到这一点。您也可以通过便捷包装器qdap::list_df2df完成此操作:

library(qdap)
list_df2df(my_list, "V4")

##    V4 a  b           c
## 1   m a  1 -0.37622031
## 2   m b  2  0.43700001
## 3   m c  3  0.65035652
## 4   m d  4 -0.09290962
## 5   m e  5  0.16675182
## 6   n a  6 -2.43296495
## 7   n b  7  1.91099315
## 8   n c  8  0.03232916
## 9   n d  9 -1.18901280
## 10  n e 10  0.42399969