为什么Ifelse无法取代NAs?

时间:2013-06-18 14:57:29

标签: r dataset na if-statement

我有一个数据集,其中一列包含yesnoNA的条目。我想将NA替换为1,并将所有非NA条目替换为0Ifelse使用NA替换非0条目,但不会将NA条目替换为1。我需要使用is.na()命令。为什么is.na()ifelse没有的地方工作?

我在下面定义了一个可重现的示例,该示例以定义为因子的列开始,因为这是我获取数据的方式。

    q <-as.factor(c(NA, "yes",  "no",   "yes", NA))

    ## Does not work
    q <- ifelse(q == "NA", 1, 0)
q    
### Returns: [1] NA  0  0  0 NA

    ## Does not work
    q[q == "NA"] <- 1
q    
### Returns: [1] NA  0  0  0 NA    

    ## This works
    q[is.na(q)] <- 1
q
### Returns: [1] 1 0 0 0 1

存在一些其他条目,但它们似乎没有这个精确的问题。 https://stackoverflow.com/a/8166616/1364839 - 此答案显示is.na()有效但不是ifelse失败的原因。

1 个答案:

答案 0 :(得分:3)

你真的不需要ifelse(),尤其是因为如果你不知道某事物的价值(这是NA所指示的!)你如何将其价值与其他东西进行比较?

> NA == NA ## yes, even NA can't be compared with itself
[1] NA

相反,请使用is.na()来确定某些内容是否为NA。如果元素为is.na(),则TRUE会返回NA,否则会返回FALSE。然后,当我们强制使用数字时,我们可以使用FALSE == 0TRUE == 1的事实:

q <-as.factor(c(NA, "yes",  "no",   "yes", NA))
q

as.numeric(is.na(q))

> as.numeric(is.na(q))
[1] 1 0 0 0 1

如果输入太多,那么

> is.na(q) + 0
[1] 1 0 0 0 1

通过相同的技巧工作,除了+正在为你做强制。