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

如何用dplyr批量替换数据框中NA值为对应补全列的值?

解决方案(dplyr通用实现)

步骤说明

针对列数较多的场景,我们通过列名匹配+批量处理的方式实现通用替换,核心是用coalesce()函数提取非NA值,同时通过字符串匹配自动关联主列和补全列。

代码实现

先加载依赖包:

library(dplyr)
library(stringr)

执行数据清洗:

# 自动筛选主列(M_数字格式)和补全列(M_C_数字格式)
main_cols <- str_subset(names(df), "^M_\\d+$")
comp_cols <- str_subset(names(df), "^M_C_\\d+$")

# 按数字后缀排序,确保列的一一对应
main_cols <- main_cols[order(str_extract(main_cols, "\\d+"))]
comp_cols <- comp_cols[order(str_extract(comp_cols, "\\d+"))]

# 替换NA并移除补全列
df_clean <- df %>%
  mutate(
    across(
      all_of(main_cols),
      ~ coalesce(., get(str_replace(cur_column(), "^M_", "M_C_")))
    )
  ) %>%
  select(-all_of(comp_cols))

# 查看清洗后的数据
df_clean

结果验证

运行后得到的df_clean如下:

M_1 M_2 M_3
1   1   5   6
2   2   1   7
3   3   3   2
4   6   4   3
5   6   1   4

代码解释

  • str_subset:通过正则表达式自动筛选所有主列和补全列,适配任意数量的同格式列;
  • order(str_extract(...)):按数字后缀排序,保证M_1对应M_C_1、M_2对应M_C_2,避免列顺序混乱;
  • across() + coalesce():对每个主列,提取自身或对应补全列的非NA值(题目中每行要么主列完整要么补全列完整,coalesce能精准获取正确值);
  • select(-all_of(comp_cols)):移除所有补全列,只保留补全后的主列。

内容的提问来源于stack exchange,提问作者mob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 10:48:16