【问题标题】:Nested list to grouped rows in R嵌套列表到 R 中的分组行
【发布时间】:2023-01-13 20:55:29
【问题描述】:
我有以下名为 l 的嵌套列表(dput 下面):
> l
$A
$A$`1`
[1] 1 2 3
$A$`2`
[1] 3 2 1
$B
$B$`1`
[1] 2 2 2
$B$`2`
[1] 3 4 3
我想将其转换为分组数据框,其中 A 和 B 是第一组列,1 和 2 是具有各自值的子组。所需的输出应如下所示:
group subgroup values
1 A 1 1
2 A 1 2
3 A 1 3
4 A 2 3
5 A 2 2
6 A 2 1
7 B 1 2
8 B 1 2
9 B 1 2
10 B 2 3
11 B 2 4
12 B 2 3
如您所见,A 和 B 是主组,1 和 2 是子组。使用 purrr::flatten(l) 或 unnest 无效。所以我想知道是否有人知道如何将嵌套列表转换为分组行数据框?
dput 我的:
l <- list(A = list(`1` = c(1, 2, 3), `2` = c(3, 2, 1)), B = list(`1` = c(2,
2, 2), `2` = c(3, 4, 3)))
【问题讨论】:
标签:
r
list
dataframe
nested
【解决方案1】:
您可以使用enframe() 将列表转换为data.frame,并将unnest 转换为value 列两次。
library(tidyr)
tibble::enframe(l, name = "group") %>%
unnest_longer(value, indices_to = "subgroup") %>%
unnest(value)
# A tibble: 12 × 3
group value subgroup
<chr> <dbl> <chr>
1 A 1 1
2 A 2 1
3 A 3 1
4 A 3 2
5 A 2 2
6 A 1 2
7 B 2 1
8 B 2 1
9 B 2 1
10 B 3 2
11 B 4 2
12 B 3 2
【解决方案2】:
将列表直接转换为数据框,然后将其转换为长格式并将 arrange 转换为您想要的顺序。
library(tidyverse)
lst %>%
as.data.frame() %>%
pivot_longer(everything(), names_to = c("group", "subgroup"),
values_to = "values",
names_pattern = "(.+?)\.(.+?)") %>%
arrange(group, subgroup)
# A tibble: 12 × 3
group subgroup values
<chr> <chr> <dbl>
1 A 1 1
2 A 1 2
3 A 1 3
4 A 2 3
5 A 2 2
6 A 2 1
7 B 1 2
8 B 1 2
9 B 1 2
10 B 2 3
11 B 2 4
12 B 2 3
【解决方案3】:
使用堆并使用 id 进行行绑定:
data.table::rbindlist(lapply(l, function(i) stack(i)), idcol = "id")
# id values ind
# 1: A 1 1
# 2: A 2 1
# 3: A 3 1
# 4: A 3 2
# 5: A 2 2
# 6: A 1 2
# 7: B 2 1
# 8: B 2 1
# 9: B 2 1
# 10: B 3 2
# 11: B 4 2
# 12: B 3 2