You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言如何迭代调用dplyr::coalesce()批量合并同组列

批量执行dplyr::coalesce()合并同组列的高效方法

问题场景

需要对多组同根列(无后缀的基础列+带.1/.2...后缀的同名列)执行coalesce()空值填充,当组的数量较多(如40组)时,手动逐组编写coalesce调用效率极低,同时需要最终仅保留无后缀的基础列,无需额外重命名。

示例测试数据集:

df = data.frame(
    a = c(1, NA, NA),
    a.1 = c(NA, 1, NA),
    a.2 = c(NA, NA, 1),
    b = c(2, NA, NA),
    b.1 = c(NA, 2, NA),
    b.2 = c(NA, NA, 2),
    c = c(3, NA, NA),
    c.1 = c(NA, 3, NA),
    c.2 = c(NA, NA, 3)
)

手动逐列编写的参考实现:

new_df = df |>
    dplyr::mutate(
        a = dplyr::coalesce(a, a.1, a.2),
        b = dplyr::coalesce(b, b.1, b.2),
        c = dplyr::coalesce(c, c.1, c.2)
    ) |>
    dplyr::select(a, b, c)

运行输出结果:

a b c
1 1 2 3
2 1 2 3
3 1 2 3

自动化实现代码

基于dplyr::across()自动识别列名规则,无需手动逐组编写调用,适配任意数量的列组:

library(dplyr)
library(stringr)

# 提取所有无数字后缀的根列名(自动识别a/b/c这类基础列)
root_cols <- names(df) |> str_subset("\\.\\d+$", negate = TRUE)

new_df <- df |>
  mutate(
    across(
      .cols = all_of(root_cols),
      .fns = ~ {
        # 自动匹配当前根列对应的所有后缀列(如根列a自动匹配a.1、a.2...)
        suffix_cols <- names(df) |> str_subset(paste0("^", cur_column(), "\\.\\d+$"))
        # 对根列+所有后缀列统一执行coalesce
        coalesce(!!!syms(c(cur_column(), suffix_cols)))
      }
    )
  ) |>
  # 仅保留合并后的根列
  select(all_of(root_cols))

方案特点

  • 无手动重复编码:不管是3组还是40组列,都不需要逐行写coalesce调用,代码自动按列名规则匹配同组列
  • 无额外重命名操作:最终输出列直接保留原始根列名(a/b/c/...),不需要后续调整列名
  • 适配灵活:自动识别任意数量的数字后缀(不管每组是2个后缀列还是10个后缀列都能正常处理),如果后缀命名规则有变化,仅需调整str_subset的正则匹配规则即可

运行上述代码得到的结果和手动实现完全一致。


内容的提问来源于stack exchange,提问作者Damon C. Roberts

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 07:09:27