如何优雅合并名称相似的DataFrame并添加来源标识列?
通用优雅的DataFrame批量合并方案
核心思路
利用mget()批量获取所有匹配命名规则的DataFrame,再结合purrr系列函数完成合并并自定义来源标识,完全适配周数动态变化的场景。
方案1:从原DataFrame名称中提取week标识
如果你的DataFrame命名本身包含week信息(例如Dai15_Dai3_week1、Dai15_Dai3_week2),直接通过字符串处理提取标识:
library(tidyverse) # 批量获取所有以"Dai15_Dai3_"开头的DataFrame target_dfs <- mget(ls(pattern = "^Dai15_Dai3_")) # 合并并添加自定义来源列 combined_df <- imap_df(target_dfs, function(df, df_name) { df %>% mutate(source = str_remove(df_name, "^Dai15_Dai3_")) })
ls(pattern = "^Dai15_Dai3_"):精准匹配所有符合命名前缀的对象名imap_df():同时遍历DataFrame列表和对应的名称,df_name就是原DataFrame的名称str_remove():剔除固定前缀,直接得到week1/week2这类目标标识
方案2:按顺序生成week标识
如果原DataFrame名称不含week信息(例如Dai15_Dai3_data1、Dai15_Dai3_data2),可按列表顺序自动生成week1/week2:
library(tidyverse) target_dfs <- mget(ls(pattern = "^Dai15_Dai3_")) # 按列表顺序生成week标识并合并 combined_df <- map2_df( .x = target_dfs, .y = paste0("week", seq_along(target_dfs)), .f = function(df, label) df %>% mutate(source = label) )
seq_along(target_dfs):根据列表长度生成连续序号map2_df():将每个DataFrame和对应的自定义标识一一绑定合并
优势说明
- 动态适配:新增/减少符合规则的DataFrame时,无需修改代码
- 灵活复用:仅需根据实际命名规则调整字符串处理逻辑(比如用
str_extract()提取特定片段) - 风格统一:遵循tidyverse的管道式编程,可读性和维护性强
内容的提问来源于stack exchange,提问作者Jackson A Swan
相关产品推荐
相关产品推荐

