如何用循环合并嵌套列表中子列表内任意数量的tibble行?
解决嵌套列表中Tibble的按行合并问题
你这个需求其实不用写复杂的循环,R里的迭代函数刚好能处理这种子列表元素数量不一的情况,给你两种简单的实现方式:
方法1:用tidyverse的purrr::map(推荐,更符合tidy风格)
因为你已经加载了dplyr,purrr是tidyverse家族的成员,语法更直观:
library(purrr) # 直接遍历父列表的每个子列表,对每个子列表执行bind_rows合并 result <- map(full_list, bind_rows)
map会自动处理每个子列表——不管里面有1个还是8个tibble,它都会把当前子列表里的所有tibble传给bind_rows,完成按行合并。
方法2:用Base R的lapply(无需额外加载包)
如果你不想用purrr,base R的lapply也能实现同样的效果:
# 简洁写法,bind_rows可以直接接收列表作为参数 result <- lapply(full_list, bind_rows) # 或者展开写清楚逻辑(效果完全一致) result <- lapply(full_list, function(sub_list) { bind_rows(sub_list) })
验证结果
运行上述任意一段代码后,打印result就能得到你预期的输出:
> 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
额外小技巧:原地修改原列表
如果你不想新建result对象,想直接把合并后的结果替换原full_list里的子列表,可以这么写:
# 用[]保留原列表的结构,只替换元素内容 full_list[] <- map(full_list, bind_rows)
内容的提问来源于stack exchange,提问作者bretauv
相关产品推荐
相关产品推荐

