我有一个数据框列表,我想将它们合并为一个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)
我不喜欢的是,我必须注意数据框的尺寸和额外列的名称。
是否没有一种功能可以通过更灵活,更通用的方式做得更好?
您可以通过使用另一种寻址列的方法来解决这两个问题:
\n\nfor(i in 1:length(my_list)) my_list[[i]]$names <- names(my_list)[i]\nRun Code Online (Sandbox Code Playgroud)\n\n或者,避免循环(更惯用的 R,恕我直言):
\n\nlapply(names(my_list), function (n) cbind(my_list[[n]], names = n))\nRun Code Online (Sandbox Code Playgroud)\n\n顺便说一句,plyr这里不需要\xe2\x80\x99t,可以通过以下方式实现相同的效果
do.call(rbind, my_list)\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
150 次 |
| 最近记录: |