[英]Create Nested List from Tibble
我想从 tibble 创建一个嵌套列表,以便更有效地存储数据,并且更容易通过子集提取信息。
我有一个 3 列的小标题,如下所示:
library(dplyr)
df <- tribble(
~a,~b,~c,
"a1", "b1", 1,
"a1", "b1", 2,
"a1", "b2", 1,
"a1", "b2", 2,
)
我想将其转换为与此相同的列表:
list(a1 = list(b1 = 1:2, b2 = 1:2))
请问有谁知道我该怎么做?
谢谢
拆分两次,即
lapply(split(df,df$a), function(x) split(x$c,x$b))
$a1
$a1$b1
[1] 1 2
$a1$b2
[1] 1 2
像下面这样的东西?
library(tidyverse)
df <- tribble(
~a,~b,~c,
"a1", "b1", 1,
"a1", "b1", 2,
"a1", "b2", 1,
"a1", "b2", 2,
)
df %>%
group_by(a,b) %>% group_split() %>% map(~ list(.x$c) %>% set_names(.x$b[1])) %>%
unlist(recursive = F) %>% list %>% set_names(unique(df$a))
#> $a1
#> $a1$b1
#> [1] 1 2
#>
#> $a1$b2
#> [1] 1 2
package rrapply 中的rrapply
rrapply()
有一个选项how = "unmelt"
可以将融化的 data.frames 转换为嵌套列表(也适用于任意级别的嵌套)。
输入 data.frame 中的每一行都转换为 output 嵌套列表中的单个节点路径:
library(dplyr)
library(rrapply)
## 1 row -> 1 leaf
rrapply(df, how = "unmelt")
#> $a1
#> $a1$b1
#> [1] 1
#>
#> $a1$b1
#> [1] 2
#>
#> $a1$b2
#> [1] 1
#>
#> $a1$b2
#> [1] 2
要将多行分配给单个叶子,我们可以首先嵌套c
列:
## 2 rows -> 1 leaf
df %>%
group_by(a, b) %>%
summarize(c = list(c), .groups = "drop") %>%
rrapply(how = "unmelt")
#> $a1
#> $a1$b1
#> [1] 1 2
#>
#> $a1$b2
#> [1] 1 2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.