R语言跨140列将NA值替换为同数据集另外140个对应列的值
R语言按行批量替换成对列值实现方法
你单变量用case_when的逻辑完全正确,批量拓展不需要写复杂自定义函数,用dplyr的across()函数就能一次性处理所有成对列,且严格遵循你设定的判断规则:仅以week0date_v2的NA状态为判断基准,整组列统一替换/保留,不单独判断单个列的NA值。
可直接运行的实现代码
library(tidyverse) dummy_data_wrangled <- dummy_data %>% mutate( across( # 填入所有需要替换的带_v2后缀的列范围 .cols = week0date_v2:var3_v2, .fns = ~if_else( condition = !is.na(week0date_v2), true = .x, # 基准列非NA时保留_v2列原有值 # 基准列为NA时,自动匹配当前列去掉_v2后缀的原始列取值填充 false = cur_data()[[gsub("_v2$", "", cur_column())]] ) ) )
适配140列真实数据的注意事项
- 只需要修改
.cols参数的列范围即可:如果140个_v2列在数据集中是连续排列的,直接写起始列名:结束列名就行,比如q1_v2:q140_v2;如果列是分散的,可以用c(列1, 列2, ...)或者ends_with("_v2")选中所有带_v2后缀的列,注意排除不需要替换的_v2列(比如示例中的verify_v2不需要替换,就不要纳入选中范围)。 - 代码会自动为每个_v2列匹配对应的无后缀原始列,不需要手动编写列名映射关系,140列可以一次性处理完成。
- 运行前可以先执行
dummy_data %>% select(你写的.cols范围) %>% colnames()查看选中的列名列表,确认没有多选/漏选列再执行替换,避免误改数据。
效果验证
以上代码运行在提供的虚拟数据集上,输出结果和给出的预期结果完全一致:第2、6行因为week0date_v2为NA,整段目标列都被对应无后缀列的值覆盖;其余行保留原有_v2列的取值,包括原有_v2列中的NA值也不会被改动。
内容的提问来源于stack exchange,提问作者lander45
相关产品推荐
相关产品推荐

