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

在嵌套列表中用循环绑定tibbles行,不管tibbles的数量是多少

  •  0
  • bretauv  · 技术社区  · 5 年前

    我有几个列表(我们称之为子列表)嵌套在一个唯一列表(我们称之为上列表)中。每个子列表都包含几个可藏元素。每个子列表都有许多介于1和8之间的元素,但每个子列表之间的元素不同。无论子列表中元素/tibbles的数量是多少,我都希望绑定这些元素/tibbles的行,以便上面列表中的每个元素都是一个大tibble。

    我知道如何访问嵌套列表中的元素,但问题是每个子列表中的元素数量不相同,所以我不知道如何在循环中进行此操作。

    如何创建绑定子列表中所有tibble的循环,无论tibble的数量是多少?

    下面是一个可重复的例子:

    library(tibble)
    library(dplyr)
    
    data1 <- tibble(id = rep(1, 26),
                    x = letters)
    
    data2 <- tibble(id = rep(2, 26),
                    x = letters)
    
    data3 <- tibble(id = rep(3, 26),
                    x = letters)
    
    list_one <- list(data1, data2)
    list_two <- list(data1, data2, data3)
    
    full_list <- list()
    full_list[["list_one"]] <- list_one
    full_list[["list_two"]] <- list_two
    

    这就是预期的结果:

    result <- list()
    result[["list_one"]] <- bind_rows(data1, data2)
    result[["list_two"]] <- bind_rows(data1, data2, data3)
    
    > result
    $list_one
    # A tibble: 52 x 2
          id x    
       <dbl> <chr>
     1     1 a    
     2     1 b    
     3     1 c    
     4     1 d    
     5     1 e    
     6     1 f    
     7     1 g    
     8     1 h    
     9     1 i    
    10     1 j    
    # … with 42 more rows
    
    $list_two
    # A tibble: 78 x 2
          id x    
       <dbl> <chr>
     1     1 a    
     2     1 b    
     3     1 c    
     4     1 d    
     5     1 e    
     6     1 f    
     7     1 g    
     8     1 h    
     9     1 i    
    10     1 j    
    # … with 68 more rows
    
    1 回复  |  直到 5 年前
        1
  •  2
  •   Bas    5 年前

    您想映射列表并应用一个函数( bind_rows )每一个元素(在你的例子中又是一个列表)。

    purrr :

    purrr::map(full_list, bind_rows)
    

    但这也可以用R基来实现,正如Ronak所评论的:

    lapply(full_list, function(x) do.call(rbind, x))