我正在尝试提取字段“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?
的长度答案 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,从而得到正确的答案。