【问题标题】:Create Nested List from Tibble从 Tibble 创建嵌套列表
【发布时间】:2022-01-11 17:12:04
【问题描述】:

我想从 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))

请问有谁知道我该怎么做?

谢谢

【问题讨论】:

    标签: r dataframe tidyverse


    【解决方案1】:

    类似以下内容?

    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
    

    【讨论】:

    • 谢谢。想到了,但我想要一个向量列表是结尾,而不是另一个小标题。
    • 我已经编辑了我的解决方案,以便只得到一个列表,如你所愿,@LiamWright。
    【解决方案2】:

    拆分两次,即

    lapply(split(df,df$a), function(x) split(x$c,x$b))
    
    $a1
    $a1$b1
    [1] 1 2
    
    $a1$b2
    [1] 1 2
    

    【讨论】:

    • 谢谢!那太棒了。有没有办法使这个通用化(例如,如果您有 4 列或更多列,按照您希望的嵌套方式从左到右排序)?
    • 我认为没那么容易
    【解决方案3】:

    rrapply() 包中的rrapply 有一个选项how = "unmelt" 可以将熔化的data.frames 转换为嵌套列表(也适用于任意级别的嵌套)。

    输入data.frame中的每一行都转换为输出嵌套列表中的单个节点路径:

    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
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-07
      • 1970-01-01
      • 2018-05-18
      • 1970-01-01
      • 2020-10-22
      • 2021-09-15
      • 1970-01-01
      相关资源
      最近更新 更多