r - 为什么Ifelse无法取代NA?

标签 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 失败的原因。

最佳答案

这里你真的不需要 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 == 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

通过相同的技巧工作,除了 + 为您进行强制转换。

关于r - 为什么Ifelse无法取代NA?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17172192/

相关文章:

r - 合并多个geom_rect()有什么问题?

r - 如何强制 R 加载包, `library()` 由于依赖而失败?

c# - 使用数据集的 Crystal Reports 子报表

list - 如何有效地将 DataSet.Tables 转换为 List<DataTable>?

python - 无法加载 CIFAR-10 数据集 : Invalid load key '\x1f'

r - GLM 适合(逻辑回归)到 SQL

r - sampsize 和 classwt 随机森林的区别

python - 如何根据另一列在列的第一行中填充 NA 值

r - ifelse 和 POSIXct : coercion and default class of NA

从数据框中删除 N/A