【问题标题】:why sometimes R can't tell difference between NA and 0?为什么有时 R 不能区分 NA 和 0?
【发布时间】:2013-11-30 14:36:37
【问题描述】:

我正在尝试提取字段“var”等于 0 的数据行。

但我发现“NA”被视为0:

有 20 行 0 和 809 行“NA”。

数据框d共有81291行。

> length(d$var[d$var == "0"])
[1] 829

> length(d$var[d$var == 0])
[1] 829

以上829个值都包括0和“NA”

> length(d$var[d$var == "NA"])
[1] 809

> length(d$var[d$var == NA])
[1] 81291

为什么上面的代码给出了d的长度?

【问题讨论】:

  • 没有。 NA 不被视为 0。发生的情况是,只要索引为 NA,“[”就会返回 NA。我认为这是 der·ri·ère 的痛苦,但它被 R 核心认为是一个特性。另外:NA != 'NA'(没有值,即使是 NA,也等于 NA。)使用 subset?
  • @DWin 我认为子集点值得扩展答案。我自己没有调查过它的行为——所以我也很感兴趣。

标签: r na expression-evaluation


【解决方案1】:

x == NA 不是测试某个变量x 的值是否为NA 的方法。请改用is.na()

> 2 == NA
[1] NA
> is.na(2)
[1] FALSE

同样,使用is.null() 来测试一个对象是否是NULL 对象。

【讨论】:

  • 这回答了我的最后一个问题,谢谢!主要问题是我试图评估 x 是否等于 0。但 NA 也被计算在内
【解决方案2】:

这是给出正确答案的解决方案。

长度(其中(d$var == 0))

您遇到该问题的原因是,在您的表达式中,条件检查不会为 NA 值给出 FALSE,而是给出 NA,当您将条件添加为索引时,会检查不是 FALSE 的值为了。在我给出的表达式中,它会检查哪些条件为 TRUE,因此您会得到正确的答案。

【讨论】:

  • 谢谢!如果我想提取 d$var 不为 0 的行怎么办? which(d$var != 0) 在这种情况下不起作用
  • 在不为0的情况下是否要计算NA?
  • 我不希望 NA 被计为 0。
  • NA 在等于 0 或不等于 0 的情况下都不会被计算在内。所以你可以只使用“equals”或“not equals”,它会给出没有 NA 数量的数字。这对你来说还不够吗?
  • 我很好奇。为什么which(d$var != 0) 不能给你你所期望的?
【解决方案3】:

评估这个的一种方法是不优雅

length(d$var[(d$var == 0) & (!is.na(d$var))])

(或者更简洁一点,sum(d$var==0 & !is.na(d$var))

我认为您的代码说明了您对 R 语法的一些误解。让我们做一个紧凑的、可重现的例子来说明:

d <- data.frame(var=c(7, 0, NA, 0))

正如您所指出的,length(d$var[d$var==0]) 将返回 3,因为 NA==0 被评估为 NA

当您将要查找的值括在引号中时,R 会将其计算为字符串。所以length(d$var[d$var == "NA"]) 询问d$var 中有多少元素是字符串 "NA"。由于您的数据集中没有字符 "NA",因此您将返回计算结果为 NA 的值的数量(因为 "NA"==NA 计算结果为 NA)。

为了回答您的最后一个问题,请查看 d$var[d$var==NA] 返回的内容:NA 的向量,其长度与您的原始向量相同。同样,任何==NA 的比较结果为NA。由于该表达式中的所有比较都是针对NA,因此您将返回一个与原始向量长度相同的NAs 向量。

【讨论】:

  • 谢谢这工作。但为什么 NA 和 0 被视为相同的值?
  • 我的回答有点啰嗦——我想你最好看看你正在测量长度的实际向量来理解。 (最好使用我提供的小例子)。
猜你喜欢
  • 2013-04-21
  • 2017-08-03
  • 2016-03-23
  • 2021-06-16
  • 1970-01-01
  • 2012-09-23
  • 2021-02-13
  • 2012-08-02
相关资源
最近更新 更多