You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何按后缀批量rbind名称不同的多个DataFrame?

按DataFrame名称后缀分组合并的实现方法

我完全懂你的需求——不用手动指定每个DataFrame名称,而是根据下划线后的数字后缀自动分组,把AB_0BCD_0合并,AB_1BCD_1合并对吧?你的循环思路方向很对,只是sprintf("*_%d", i)里的通配符没法直接在mget里生效,咱们换个方式就能实现这个“通配符匹配+分组合并”的逻辑。

方法一:自动分组+批量合并(推荐)

这种方式不需要提前知道后缀数字,能自动识别所有符合XXX_数字格式的DataFrame并分组:

  1. 筛选符合命名规则的DataFrame名称
    先用ls()结合正则表达式,找出当前环境里所有以上划线加数字结尾的对象:

    # 匹配"任意字符+下划线+数字"的命名格式
    df_names <- ls(pattern = "^.*_\\d+$")
    
  2. 按后缀数字分组
    提取每个名称的后缀数字,然后把名称按后缀分组:

    # 提取下划线后的数字作为分组依据
    suffixes <- sub("^.*_(\\d+)$", "\\1", df_names)
    # 按后缀分组名称
    grouped_names <- split(df_names, suffixes)
    
  3. 批量合并每组的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,这时候可以用dplyrbind_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

火山引擎 最新活动