【问题标题】:Bind rows of tibbles in a nested list with a loop, whatever the number of tibbles使用循环绑定嵌套列表中的 tibbles 行,无论 tibbles 的数量是多少
【发布时间】:2020-07-10 19:34:58
【问题描述】:

我有几个列表(我们称为子列表)嵌套在一个唯一列表(我们称为超列表)中。每个子列表包含几个小标题元素。每个子列表具有 1 到 8 个之间的元素数量,但从一个子列表到另一个不同。无论子列表中有多少元素/小标题,我都想绑定这些元素/小标题的行,以便超列表的每个元素都是一个大标题。

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

如何创建一个循环来绑定子列表中的所有小标题,无论小标题的数量是多少?

这是一个可重现的例子:

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

【问题讨论】:

  • purrr::map(full_list, bind_rows) 怎么样?

标签: r for-loop


【解决方案1】:

您想要映射列表并将函数 (bind_rows) 应用于每个元素(在您的情况下又是一个列表)。

我会使用purrr 进行映射:

purrr::map(full_list, bind_rows)

但也可以使用 Ronak 评论的基本 R 来完成:

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

【讨论】:

  • 当我将purrr 函数应用于我的数据时,我有Error : Column `X` can't be converted from numeric to factor。也许你知道如何处理它?
  • 这可能意味着在您的一个子列表中有一个数据框,其列X 是数字,另一个数据框的列X 是一个因素。它尝试绑定这些并且无法将数字列解析为一个因子。您应该查看您的基础数据以了解发生了什么。
猜你喜欢
  • 2019-09-18
  • 2018-07-03
  • 2019-09-22
  • 1970-01-01
  • 2021-06-13
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多