我想将数据帧列表转换为一个大数据帧。问题是,我只有列表而不是单独的数据框。新数据框中应包含一个带有数据框名称且没有rownames的附加列。
这是我试过的:
d1 <- data.frame(x = c(1.1,2.0,3.5), y = c(4.1,5.1,6.3))
d2 <- data.frame(x = c(3.3,2.7,1.9,2.9,1.9),y = c(6.4,5.2,2.4,3.0,5.1))
d3 <- data.frame(x = c(3.4,2.7,1.8,0.2),y = c(6.2,5.0,4.1,0.5))
my.list <- list(green = d1, blue = d2, yellow = d3)
目标数据框应如下所示:
target.df <- data.frame(colour = c(rep("green",nrow(d1)), rep("blue", nrow(d2)), rep("yellow", nrow(d3))),
x = c(1.1,2.0,3.5, 3.3,2.7,1.9,2.9,1.9, 3.4,2.7,1.8,0.2),
y = c(4.1,5.1,6.3, 6.4,5.2,2.4,3.0,5.1, 6.2,5.0,4.1,0.5)
)
代码
my.df <- do.call(rbind.data.frame, my.list)
生成一个数据框,其中包含来自数据框名称的行名,而不是额外的列。
我试过了:
new.df <- stack(my.list)
但有Error in stack.default(my.list) : at least one vector element is required
如何制作目标数据框?
答案 0 :(得分:2)
我们可以使用Map
来执行此操作
do.call(rbind, unname(Map(cbind, colour = names(my.list), my.list)))
结果:
do.call(rbind, unname(Map(cbind, colour = names(my.list), my.list)))
colour x y
1 green 1.1 4.1
2 green 2.0 5.1
3 green 3.5 6.3
4 blue 3.3 6.4
5 blue 2.7 5.2
6 blue 1.9 2.4
7 blue 2.9 3.0
8 blue 1.9 5.1
9 yellow 3.4 6.2
10 yellow 2.7 5.0
11 yellow 1.8 4.1
12 yellow 0.2 0.5
如果我们使用的是dplyr
,那么bind_rows
会选择.id
library(dplyr)
bind_rows(my.list, .id = 'colour')