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

