如何按后缀批量rbind名称不同的多个DataFrame?
按DataFrame名称后缀分组合并的实现方法
我完全懂你的需求——不用手动指定每个DataFrame名称,而是根据下划线后的数字后缀自动分组,把AB_0和BCD_0合并,AB_1和BCD_1合并对吧?你的循环思路方向很对,只是sprintf("*_%d", i)里的通配符没法直接在mget里生效,咱们换个方式就能实现这个“通配符匹配+分组合并”的逻辑。
方法一:自动分组+批量合并(推荐)
这种方式不需要提前知道后缀数字,能自动识别所有符合XXX_数字格式的DataFrame并分组:
筛选符合命名规则的DataFrame名称
先用ls()结合正则表达式,找出当前环境里所有以上划线加数字结尾的对象:# 匹配"任意字符+下划线+数字"的命名格式 df_names <- ls(pattern = "^.*_\\d+$")按后缀数字分组
提取每个名称的后缀数字,然后把名称按后缀分组:# 提取下划线后的数字作为分组依据 suffixes <- sub("^.*_(\\d+)$", "\\1", df_names) # 按后缀分组名称 grouped_names <- split(df_names, suffixes)批量合并每组的DataFrame
用lapply遍历每个分组,合并对应的DataFrame:# 合并每组,结果是一个列表,键为后缀数字 merged_dfs <- lapply(grouped_names, function(names) { do.call(rbind, mget(names)) }) # 查看合并结果:merged_dfs$0 是AB_0+BCD_0,merged_dfs$1是AB_1+BCD_1
方法二:贴近你原思路的循环实现
如果你更习惯用循环,直接在循环里用正则匹配对应后缀的名称就行:
# 假设你知道后缀是0和1,也可以用unique(suffixes)自动获取 for(i in 0:1) { # 匹配所有以"_i"结尾的DataFrame名称 target_names <- ls(pattern = paste0("^.*_", i, "$")) # 合并并赋值给新变量,比如merged_0、merged_1 assign(paste0("merged_", i), do.call(rbind, mget(target_names))) }
小提示:处理列名不一致的情况
如果不同DataFrame的列名不完全一致,base::rbind会报错或填充NA,这时候可以用dplyr的bind_rows来自动对齐列,更灵活:
library(dplyr) for(i in 0:1) { target_names <- ls(pattern = paste0("^.*_", i, "$")) assign(paste0("merged_", i), bind_rows(mget(target_names))) }
内容的提问来源于stack exchange,提问作者S31




