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

ged*_*all 5 r plyr dataframe

我有一个数据框列表,我想将它们合并为一个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 
Run Code Online (Sandbox Code Playgroud)

我想将它们堆叠在一起,但又不会丢失data.frame(“ m”,“ n”)名称的上下文。理想情况下,原始数据帧的名称应作为额外的列包含在最终数据帧中。一种方法是只在使用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    
Run Code Online (Sandbox Code Playgroud)

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

是否没有一种功能可以通过更灵活,更通用的方式做得更好?

Kon*_*lph 1

您可以通过使用另一种寻址列的方法来解决这两个问题:

\n\n
for(i in 1:length(my_list)) my_list[[i]]$names <- names(my_list)[i]\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
lapply(names(my_list), function (n) cbind(my_list[[n]], names = n))\n
Run Code Online (Sandbox Code Playgroud)\n\n

顺便说一句,plyr这里不需要\xe2\x80\x99t,可以通过以下方式实现相同的效果

\n\n
do.call(rbind, my_list)\n
Run Code Online (Sandbox Code Playgroud)\n