0

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

4

3 回答 3

2

x == NA不是测试某个变量的值是否xNA. 改用is.na()

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

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

于 2013-11-30T14:40:17.567 回答
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"==NANA

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

于 2013-11-30T14:47:39.340 回答
1

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

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

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

于 2013-11-30T14:50:31.280 回答