R语言ifelse函数返回NA而非0问题求助
问题根源
你的代码返回1和NA而非0,是因为用到的prtvede2、prtvtcat、prtvtdbe、prtvtdbg这些变量中存在NA值。当变量为NA时,==的判断结果会是NA,而|逻辑运算只要有一个操作数是NA,结果就会是NA。ifelse遇到NA的条件时,会直接返回NA,不会执行else分支的0。
解决方法
以下几种方式都可以解决这个问题:
方法1:先处理逻辑向量的NA值
先构造判断条件的逻辑向量,把其中的NA转为FALSE,再转成整数型的0/1:
# 构造判断条件 cond <- (ess$prtvede2 == 6) | (ess$prtvtcat == 3) | (ess$prtvtdbe == 7) | (ess$prtvtdbg %in% c(3, 5)) # 将NA转为FALSE cond[is.na(cond)] <- FALSE # 转成整数1/0生成虚拟变量 ess$rpopuv <- as.integer(cond)
方法2:嵌套ifelse处理NA情况
直接在ifelse中先判断是否存在NA,存在则返回0,否则再判断条件:
ess$rpopuv <- ifelse( is.na(ess$prtvede2) | is.na(ess$prtvtcat) | is.na(ess$prtvtdbe) | is.na(ess$prtvtdbg), 0, ifelse( ess$prtvede2 == 6 | ess$prtvtcat == 3 | ess$prtvtdbe == 7 | ess$prtvtdbg %in% c(3,5), 1, 0 ) )
方法3:使用dplyr的case_when(更清晰)
case_when会自动将所有未匹配的情况(包括NA)归到最后一个TRUE分支,直接返回0:
library(dplyr) ess <- ess %>% mutate( rpopuv = case_when( prtvede2 == 6 | prtvtcat == 3 | prtvtdbe == 7 | prtvtdbg %in% c(3,5) ~ 1, TRUE ~ 0 ) )
内容的提问来源于stack exchange,提问作者Oneliner
相关产品推荐
相关产品推荐

