2

我有一个数据集,其中一列包含yesno和的条目NA。我想用 替换任何NA1并用 替换任何非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失败。

4

1 回答 1

4

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

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

相反,用于is.na()识别某物是否NA存在。如果元素是则is.na()返回,否则返回。然后我们可以使用当我们强制转换为数字时的事实:TRUENAFALSEFALSE == 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

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

于 2013-06-18T15:19:22.487 回答