【问题标题】:Why is ifelse returning NA as false?为什么 ifelse 返回 NA 为假?
【发布时间】:2021-11-19 20:16:59
【问题描述】:

由于某种原因,我的 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 

任何线索为什么会发生这种情况?

【问题讨论】:

    标签: r dataframe if-statement na


    【解决方案1】:

    返回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"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-21
      • 2014-02-03
      • 2012-08-27
      • 2019-06-11
      • 2014-09-07
      相关资源
      最近更新 更多