为什么有时R不能分辨出NA和0之间的区别?

时间:2013-11-30 14:36:37

标签: r na expression-evaluation

我正在尝试提取字段“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?

的长度

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

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,因此您将获得NA s的向量,该向量与原始向量的长度相同。

答案 2 :(得分:1)

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

  

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

你面临这个问题的原因是在你的表达式中,条件检查不给NA值假,否则它给出NA而当你添加条件作为索引时,检查非FALSE的值对于。在我给出的表达式中,它检查哪些条件为TRUE,从而得到正确的答案。