如何用list_rbind保留列表中命名的0行tibble?
解决list_rbind丢弃0行命名tibble的问题
问题核心是list_rbind会忽略0列0行的tibble元素,因为这类元素没有和其他子表匹配的列结构。要保留这些命名元素,需要先统一所有子tibble的列结构,再进行合并。
方法一:统一所有子表的列结构
先提取所有子tibble的列名并集,给每个子表补充缺失的列(填充NA),确保结构一致后再合并:
library(tidyverse) li <- list("a"=tibble(x=1), "b"=tibble(x=2), "c"=tibble(x=NULL)) # 获取所有子表的列名并集 all_columns <- li %>% map(names) %>% reduce(union) # 为每个子表补充缺失列,填充NA processed_list <- li %>% map( ~ .x %>% mutate(across(all_of(setdiff(all_columns, names(.x))), ~ NA_real_)) ) # 合并并保留元素名称 processed_list %>% list_rbind(names_to = "element_names")
运行结果:
# A tibble: 3 × 2 element_names x <chr> <dbl> 1 a 1 2 b 2 3 c NA
方法二:补全0列tibble的结构
如果所有非空tibble的结构一致,可以直接参考它们的结构,将0列tibble替换为同结构的空表,再合并:
library(tidyverse) li <- list("a"=tibble(x=1), "b"=tibble(x=2), "c"=tibble(x=NULL)) # 获取参考结构(取第一个非空列的子表) ref_table <- li %>% keep(~ncol(.x) > 0) %>% first() # 替换0列的tibble为同结构的空表 processed_list <- li %>% map( ~ if (ncol(.x) == 0) ref_table %>% slice(0) else .x ) # 合并并保留元素名称 processed_list %>% list_rbind(names_to = "element_names")
这个方法更简洁,适合所有非空tibble结构统一的场景,结果和方法一一致。
内容的提问来源于stack exchange,提问作者zoowalk
相关产品推荐
相关产品推荐

