R语言bind_rows合并嵌套列表保留来源与月份列方法
嵌套列表按层级名称合并的实现方案
你的monthly_data是两层嵌套命名列表,直接调用bind_rows()只能识别单层列表的名称标识,无法自动读取两层嵌套的名称,以下是两种可直接运行的正确实现:
方案1:purrr分层遍历合并(推荐,代码最简洁)
依赖tidyverse系列的purrr和dplyr,不需要额外做列表转换,逻辑是逐层给数据框加标识后合并:
library(dplyr) library(purrr) merged_data <- imap_dfr( monthly_data, ~ bind_rows(.x, .id = "month") %>% mutate(source_file = .y) )
代码说明:
imap_dfr会遍历第一层列表,.x代表当前遍历到的单个数据源下的12个月份数据框集合,.y代表当前第一层元素的名称(也就是Export_A1.xlsx这类文件名)- 内层
bind_rows(.x, .id = "month")会合并单个数据源下的12个月份数据,同时自动把第二层列表的名称(m1到m12)存入month列 - 最后通过
mutate新增source_file列存第一层的文件名,imap_dfr会自动把所有处理完的单数据源结果纵向拼接成最终的tibble
方案2:展平列表后合并(适合不想用imap的场景)
先把两层嵌套列表展平为单层列表,保留两层名称信息后再合并拆分:
library(dplyr) library(tidyr) # 展平嵌套列表为单层 flat_list <- unlist(monthly_data, recursive = FALSE) # 拼接两层名称为唯一标识 names(flat_list) <- paste( rep(names(monthly_data), each = 12), unlist(map(monthly_data, names)), sep = "||" ) merged_data <- bind_rows(flat_list, .id = "tmp_col") %>% separate(tmp_col, into = c("source_file", "month"), sep = "\\|\\|")
代码说明:
unlist(monthly_data, recursive = FALSE)会把两层嵌套拆成单层,每个元素对应一个月份的tibble- 给每个单层列表元素命名为「文件名||月份」的组合格式,避免不同数据源下重名的月份标识冲突
- 合并时通过
.id参数把组合名称存入临时列,最后拆分为source_file和month两个目标列即可
可选后续处理
如果需要把月份列转为数值格式,可以在得到结果后追加一步处理:
merged_data <- merged_data %>% mutate(month = as.integer(gsub("m", "", month)))
注意:使用以上方法前请确认第一层、第二层列表都有完整的命名,否则对应标识列会生成位置序号或NA值。
内容的提问来源于stack exchange,提问作者silent_hunter
相关产品推荐
相关产品推荐

