如何用同数据集带.x后缀的对应列替换多列中的NA?
解决方案
用dplyr的mutate(across())结合coalesce()函数是最简便的批量处理方案,正好适配你多列替换的需求,同时用str_replace()来生成对应的.x后缀列名,完全符合你的要求:
library(dplyr) library(stringr) # 批量替换测试列的NA为对应.x列的值 df_processed <- df %>% mutate(across( # 筛选所有需要处理的测试列(匹配以Test开头且不带.x的列,可根据实际列名调整正则规则) matches("^Test\\d+$"), ~ coalesce(., !!sym(str_replace(cur_column(), "$", ".x"))) )) print(df_processed)
代码说明:
matches("^Test\\d+$"):精准筛选出Test1、Test2这类测试列,若实际列名规则不同,可修改正则(比如matches("^[A-Za-z]+\\d+$")匹配字母加数字格式的列)。str_replace(cur_column(), "$", ".x"):通过字符串替换,给当前处理的列名添加.x后缀,自动生成对应的替补列名。coalesce(., 替补列):coalesce会依次取第一个非NA的值,刚好实现“原列非NA则保留原值,原列NA则用对应.x列的值”的逻辑。mutate(across()):批量遍历所有目标列,避免手动重复编写每一列的替换逻辑,完美适配你实际数据有大量列的场景。
处理后结果示例:
ID Age Gender Test1 Test2 Test3 Test1.x Test2.x Test3.x 1 7877 40 M 78 70 84 NA NA 84 2 6345 54 F 62 99 61 62 NA NA 3 9170 41 F 82 80 96 82 NA NA 4 2400 83 M 100 95 100 94 95 NA 5 5920 66 M 77 62 69 NA NA NA 6 2569 34 M 99 96 81 NA NA 100 7 7879 28 M 64 71 90 NA NA 90 8 8652 53 F 95 74 89 95 NA NA 9 6357 97 F 92 86 83 NA 86 NA 10 1943 45 M 95 72 98 NA 72 NA
内容的提问来源于stack exchange,提问作者Michiel Besseling
相关产品推荐
相关产品推荐

