将数据帧列表转换为一个数据帧,其中df名称在额外列中

时间:2017-07-12 09:28:00

标签: r list dataframe stack rbind

我想将数据帧列表转换为一个大数据帧。问题是,我只有列表而不是单独的数据框。新数据框中应包含一个带有数据框名称且没有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

如何制作目标数据框?

1 个答案:

答案 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')