簡體   English   中英

從 Tibble 創建嵌套列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM