为什么R中is.na()和!=比较运算对NA值的筛选结果不一致
结果差异的根本原因
R 语言中NA代表缺失值,所有直接和NA进行的比较运算(==、!=、>、<等)返回结果都是NA,而非TRUE或FALSE,case_when对返回NA的条件会判定为不匹配,自动跳过该条规则,继续向下匹配后续条件。
两段代码的执行逻辑差异
- 生成
df13的代码中,第二个判断条件为Test %in% c("NA") & TYN!="Yes":
你的df12中TYN列全为NA,因此TYN!="Yes"的返回结果全为NA,整个条件判断结果为NA,会被case_when跳过,最终匹配到最后一条规则Test %in% c("Fail", "NA")~"Fail",所以Rel列对应值为Fail。 - 生成
df14的代码中,第二个判断条件为Test %in% c("NA") & is.na(TYN):is.na()是专门用来检测缺失值的函数,对NA会返回TRUE,整个条件判断成立,因此返回你预期的"NA"。
关于TYN为NA时是否属于TYN!="Yes"的疑问
答案是不属于,你可以直接在R控制台执行NA != "Yes",返回结果为NA,既不是TRUE也不是FALSE,无法触发&连接的条件判断。
如果需要让TYN为NA的场景也被不等于Yes的条件覆盖,可以把条件修改为以下两种写法之一:
# 写法1:显式加is.na判断 Test %in% c("NA") & (TYN != "Yes" | is.na(TYN)) ~ "NA" # 写法2:用%in%取反,简化判断 Test %in% c("NA") & !TYN %in% "Yes" ~ "NA"
内容的提问来源于stack exchange,提问作者Stataq
相关产品推荐
相关产品推荐

