我有一个数据框列表,我想将它们组合成一个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
我不喜欢的是我必须注意数据框的尺寸和额外列的名称。
那里有没有更好的功能,以更灵活和通用的方式做到这一点?
答案 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