【问题标题】: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 是第一组列,12 是具有各自值的子组。所需的输出应如下所示:

   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 是主组,12 是子组。使用 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-17
          • 1970-01-01
          • 2019-01-09
          • 1970-01-01
          • 2020-03-29
          • 2021-05-24
          相关资源
          最近更新 更多