我有一个数据集,其中一列包含 yes
、no
和 NA
条目。我想将任何 NA
替换为 1
,并将任何非 NA
条目替换为 0
。 Ifelse
将非 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
失败的原因。
最佳答案
这里你真的不需要 ifelse()
,尤其是因为如果你不知道某个东西的值(这就是 NA
所指示的!)你能将它的值(value)与其他东西进行比较吗?
> NA == NA ## yes, even NA can't be compared with itself
[1] NA
相反,请使用 is.na()
来识别某些内容是否为 NA
。如果元素为 NA
,则 is.na()
返回 TRUE
,否则返回 FALSE
。然后,当我们强制转换为数字时,我们可以使用 FALSE == 0
和 TRUE == 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
通过相同的技巧工作,除了 +
为您进行强制转换。
关于r - 为什么Ifelse无法取代NA?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17172192/