将数据框列表转换为额外列中带有 df 名称的一个数据框

Transform list of data frames to one data frame with df names in extra column

我想将数据框列表转换为一个大数据框。问题是,我只有列表,没有单独的数据框。新数据框中应包含一个包含数据框名称但不包含行名的附加列。

这是我尝试过的:

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

如何生成目标数据框?

我们可以使用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')