为什么 ifelse 将 NA 返回为 false?

Why is ifelse returning NA as false?

出于某种原因,我的 ifelse 语句返回的 NA 就好像它们是假的而不是 NA。知道为什么会发生吗?

相关列的数字从 1 到 10。

library(dplyr)

data <- read.csv('210901_CLEANN_Risks_Research.csv')

data <- data %>% mutate_if(is.character, as.factor)

data[data==""]<-NaN
data[data=="Refused to answer"]<-NaN

table(data$safety)
unique(data$safety)

a <- c(1,2,3,4,5)

data$safety <- ifelse(data$safety %in% a , "Yes", "No")

unique(data$safety)
table(data$safety)

输出如下:

data <- read.csv('210901_CLEANN_Risks_Research.csv')

data <- data %>% mutate_if(is.character, as.factor)

data[data==""]<-NA
data[data=="Refused to answer"]<-NA 
table(data$safety)

>    1    2    3    4    5    6    7    8    9   10 
> 2936 1112  836  548  479  261  165   91   51   12 
unique(data$safety)
> [1]  1  2  3  7  5  6  4  8  9 10 NA
  
a <- c(1,2,3,4,5)
data$safety <- ifelse(data$safety %in% a , "Yes", "No")
 
unique(data$safety)
> [1] "Yes" "No" 
table(data$safety)
>  No  Yes 
> 583 5911 

知道为什么会发生这种情况吗?

返回 FALSE 的不是 ifelse,而是 %in%

c(NA, 5, 3) %in% 3
[1] FALSE FALSE  TRUE

虽然

的行为与逐元素比较运算符 (==) 不同
c(NA, 5, 3) == 3
[1]    NA FALSE  TRUE

可能,我们需要在 %in%

之前处理好 NA
ifelse(is.na(data$safety), NA, ifelse(data$safety %in% a , "Yes", "No"))