代码之家  ›  专栏  ›  技术社区  ›  geoscience123

如何在R中展开列表

  •  1
  • geoscience123  · 技术社区  · 3 年前

    我正在尝试将列表更改为数据帧。列表中的每个元素可能具有不相等长度的值。下面给出了一个示例列表:

    a = c(1:9)
    b = c(10:14)
    test_list = list(a, b)
    print(test_list)
    
    #> [[1]]
    #> [1] 1 2 3 4 5 6 7 8 9
    #> 
    #> [[2]]
    #> [1] 10 11 12 13 14
    

    这里给出了所需的结果:

    desired_result = data.frame(var1 = c(rep(1,9), rep(2,5)),
                                var2 = c(1:14))
    print(desired_result)
    
    #>    var1 var2
    #> 1     1    1
    #> 2     1    2
    #> 3     1    3
    #> 4     1    4
    #> 5     1    5
    #> 6     1    6
    #> 7     1    7
    #> 8     1    8
    #> 9     1    9
    #> 10    2   10
    #> 11    2   11
    #> 12    2   12
    #> 13    2   13
    #> 14    2   14
    

    创建于2023-07-24 reprex v2.0.2

    4 回复  |  直到 3 年前
        1
  •  4
  •   Darren Tsai    3 年前

    给名单上的名字,然后 stack() :

    stack(setNames(test_list, seq_along(test_list)))[2:1]
    
    #    ind values
    # 1    1      1
    # 2    1      2
    # 3    1      3
    # 4    1      4
    # 5    1      5
    # 6    1      6
    # 7    1      7
    # 8    1      8
    # 9    1      9
    # 10   2     10
    # 11   2     11
    # 12   2     12
    # 13   2     13
    # 14   2     14
    
        2
  •  2
  •   s_baldur    3 年前
    data.frame(
      var1 = rep(seq_along(test_list), lengths(test_list)),
      var2 = unlist(test_list)
    )
    
    
    #    var1 var2
    # 1     1    1
    # 2     1    2
    # 3     1    3
    # 4     1    4
    # 5     1    5
    # 6     1    6
    # 7     1    7
    # 8     1    8
    # 9     1    9
    # 10    2   10
    # 11    2   11
    # 12    2   12
    # 13    2   13
    # 14    2   14
    
        3
  •  2
  •   Onyambu    3 年前

    在tidyverse:

    unnest(enframe(test_list), value)
    
    # A tibble: 14 × 2
        name value
       <int> <int>
     1     1     1
     2     1     2
     3     1     3
     4     1     4
     5     1     5
     6     1     6
     7     1     7
     8     1     8
     9     1     9
    10     2    10
    11     2    11
    12     2    12
    13     2    13
    14     2    14
    
        4
  •  1
  •   Till    3 年前

    lapply() enframe() 将每个列表条目转换为 data.frame bind_rows() 然后将其合并 select() 我们可以放下 name enframe() 创建并重命名 value var2

    library(tidyverse)
    
    test_list |> 
      lapply(enframe) |> 
      bind_rows(.id = "var1") |> 
      select(-name, var1, var2 = value)
    #> # A tibble: 14 × 2
    #>    var1   var2
    #>    <chr> <int>
    #>  1 1         1
    #>  2 1         2
    #>  3 1         3
    #>  4 1         4
    #>  5 1         5
    #>  6 1         6
    #>  7 1         7
    #>  8 1         8
    #>  9 1         9
    #> 10 2        10
    #> 11 2        11
    #> 12 2        12
    #> 13 2        13
    #> 14 2        14
    
    推荐文章