R语言基于两列条件更新数据框name3列 解决ifelse返回NA问题
R数据框条件更新出现NA值的解决办法
错误原因
你代码运行出现NA的核心原因是R中对NA使用==做等值判断时,返回值为NA而非FALSE,ifelse接收NA作为判断条件时,对应的输出也会是NA,因此所有name1为NA的行,name3都会被替换为NA。
另外你描述的判断逻辑和你给出的期望输出存在偏差:你写的逻辑是「name1等于"a"且name2为NA时替换name3」,但你期望修改的第6~8行name1为NA,并不满足该条件,你实际的目标逻辑应该是name1和name2同时为NA时,将name3的"a"替换为"b"。
解决方案
方案1:匹配你写的原始逻辑
如果你确实需要实现「name1等于"a"且name2为NA时替换name3为"b"」,用%in%替换==避免NA判断问题即可:
library(dplyr) df %>% mutate(name3 = ifelse(name1 %in% "a" & is.na(name2), "b", name3))
方案2:匹配你给出的期望输出
如果你的目标是得到你贴出的期望结果,直接判断name1和name2是否同时为NA即可:
library(dplyr) df %>% mutate(name3 = ifelse(is.na(name1) & is.na(name2), "b", name3))
运行后输出结果如下:
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
补充说明
如果需要更严谨的匹配,只替换name3为"a"的行,可以在条件中加name3 == "a"的判断,同样用%in%避免NA问题:
df %>% mutate(name3 = ifelse(is.na(name1) & is.na(name2) & name3 %in% "a", "b", name3))
内容的提问来源于stack exchange,提问作者Anh
相关产品推荐
相关产品推荐

