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
相关产品推荐
相关产品推荐

