【问题标题】:Why does Ifelse fail to replace NAs?为什么 Ifelse 无法替换 NA?
【发布时间】:2013-06-18 14:57:28
【问题描述】:

我有一个数据集,其中一列包含 yesnoNA 的条目。我想用1 替换任何NA,并用0 替换任何非NA 条目。 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”与NA无关。
  • 阅读?base::Logic?NA
  • 阅读?base::Logic?NAifelse( is.na(q) , 1, 0)
  • 您不能与 NA 值进行任何比较,任何与 NA 的比较都会导致 NA。试试这个:c(NA=="yes",NA==NA,NA=="NA",NA==1,is.na(NA))
  • @DTRM 我更新了评论-我需要咖啡,看?is.na,实际上,而不是ifelse 只是做as.integer( is.na( q ) ) - 更新 - 哦,那是你是做。那么这是什么问题呢?!!

标签: r dataset na if-statement


【解决方案1】:

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

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

改为使用is.na() 来识别某事物是否为NA。如果元素是 NAis.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

除了+ 为您进行强制转换外,其他方法相同。

【讨论】:

  • 非常感谢!此外,上面的@SimonO101 指出ifelse( is.na(q) , 1, 0) 是另一种方法。
  • @DTRM 不是真的,如果你看看ifelse 的胆量,你会发现这样的事情有点矫枉过正。可能更普遍有用,但与您的问题无关。
猜你喜欢
  • 2022-01-24
  • 2021-11-19
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
相关资源
最近更新 更多