R语言DataFrame按规则替换列值:替换a为b保留f兼容NA场景求解
解决方案
问题原因说明
你参考的代码存在两个核心问题:
name1 == "a"遇到列中的NA值会返回NA,逻辑判断遇到NA会无法正常匹配;any()是对整列做聚合判断,不是逐行判断,逻辑和你的需求不匹配。
可行方案
方案1:dplyr实现
直接针对name3列的值做替换即可满足你的需求:
library(dplyr) df <- df %>% mutate(name3 = case_when( name3 == "a" ~ "b", TRUE ~ name3 ))
如果需要兼容原代码关联其他列的逻辑,可添加NA值兼容处理:
df %>% mutate(name3 = case_when( "a" %in% name1 & is.na(name2) & name3 == "a" ~ "b", TRUE ~ name3 ))
方案2:base R实现
用基础语法直接替换更简洁:
df$name3[df$name3 == "a" & !is.na(df$name3)] <- "b"
输出结果
运行上述代码后即可得到你需要的结果:
name1 name2 name3 1 a b b 2 a b b 3 a b b 4 a b b 5 a c c 6 <NA> <NA> b 7 <NA> <NA> b 8 <NA> <NA> b 9 <NA> <NA> f
内容的提问来源于stack exchange,提问作者Anh
相关产品推荐
相关产品推荐

