将数据框列表转换为额外列中带有 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')
我想将数据框列表转换为一个大数据框。问题是,我只有列表,没有单独的数据框。新数据框中应包含一个包含数据框名称但不包含行名的附加列。
这是我尝试过的:
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')