r - 将大小不等的列表转换为R中的数据框
问题描述
给定一个具有不同长度的 n 个元素的列表,如下所示:
library(tidyverse)
l <- list(
"a" = c(1,2),
"b" = c(3),
"c" = c(4,5,6)
)
我想将此列表转换为以下数据框:
out <- data.frame(
foo = c("a", "a", "b","c","c","c"),
bar = c(1:6)
)
print(out)
#> foo bar
#> 1 a 1
#> 2 a 2
#> 3 b 3
#> 4 c 4
#> 5 c 5
#> 6 c 6
在 R 中实现这一目标的最佳和最简单的方法是什么?我设法得到了想要的输出,但是代码看起来很麻烦而且太复杂了:
df <- data.frame()
for (i in 1:length(l)){
d <- data.frame(
names(l[i]) <- l[i]
)
d <- d %>% pivot_longer(1,names_to = "foo", values_to = "bar")
df <- bind_rows(df,d)
}
print(df)
#> foo bar
#> 1 a 1
#> 2 a 2
#> 3 b 3
#> 4 c 4
#> 5 c 5
#> 6 c 6
由reprex 包于 2021-10-05 创建 (v2.0.0 )
解决方案
library(tidyverse)
l <- list(
"a" = c(1,2),
"b" = c(3),
"c" = c(4,5,6)
)
l
#> $a
#> [1] 1 2
#>
#> $b
#> [1] 3
#>
#> $c
#> [1] 4 5 6
l %>% enframe() %>% unnest(value)
#> # A tibble: 6 x 2
#> name value
#> <chr> <dbl>
#> 1 a 1
#> 2 a 2
#> 3 b 3
#> 4 c 4
#> 5 c 5
#> 6 c 6
由reprex 包于 2021-10-05 创建(v2.0.1)