我有一个数据集,其中一列包含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
失败的原因。
答案 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 == 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
通过相同的技巧工作,除了+
正在为你做强制。