为什么R语言ifelse语句会将NA识别为FALSE而非保留原NA值?
问题原因分析
核心原因
- 首先是类型隐式转换问题:你的代码中提前通过
mutate_if(is.character, as.factor)把safety列转为了因子类型,因子底层存储为整数索引,在和数值向量a = c(1,2,3,4,5)做%in%匹配时,因子的取值会被优先转为整数而非对应的数值文本,原本为NA的因子值在匹配时被判定为不命中,返回FALSE,最终被ifelse归到了"No"分类。 - 其次是
base::ifelse()的设计特性:原生ifelse不会主动保留测试条件中的NA,如果测试条件返回NA且你没有显式处理,部分场景下会被隐式判定为FALSE。
修复方案
- 方案1:显式在逻辑判断中处理缺失值,不需要额外加载包:
data$safety <- ifelse( is.na(data$safety), NA_character_, ifelse(data$safety %in% a, "Yes", "No") )
- 方案2:改用dplyr包的
if_else()函数,原生支持指定缺失值的返回结果,更稳妥:
data$safety <- dplyr::if_else( condition = data$safety %in% a, true = "Yes", false = "No", missing = NA_character_ )
额外优化建议
建议在将字符列转为因子之前先处理空值、拒绝回答等异常值,避免因子生成多余的无效level,修改代码顺序如下:
data <- read.csv('210901_CLEANN_Risks_Research.csv') # 先处理缺失值 data[data==""]<-NA data[data=="Refused to answer"]<-NA # 再转因子 data <- data %>% mutate_if(is.character, as.factor)
内容的提问来源于stack exchange,提问作者pegasus123
相关产品推荐
相关产品推荐

