以下是测试:
x = data.frame(a=1:10, b=2:11)
x$b[2:5] = NA
x[x$b<9, ]
结果:
a b
1 1 2
NA NA NA
NA.1 NA NA
NA.2 NA NA
NA.3 NA NA
6 6 7
7 7 8
首先,为什么在地球上它包含x$b
中的那些NA条目?
即使这是有道理的,为什么然后改变所有相应的
x$a
中的条目进入NA?
我希望我不会在某个地方犯一个愚蠢的错误。 我在Ubuntu 14.04上使用R 3.1.0。
答案 0 :(得分:2)
只需查看x$b<9
评估的内容
[1] TRUE NA NA NA NA TRUE
[7] TRUE FALSE FALSE FALSE
那里有NA
个值。当你使用逻辑向量进行索引时,TRUE意味着你应该包括行FALSE意味着你应该排除行,但是NA意味着不清楚,所以R做的只是返回一行NA值,因为你没有&t; t真的要求包括或排除一行,以便你得到一个奇怪的可能值组合。
解决这个问题的一个常见方法是
x[which(x$b<9), ]
会自动删除NA值,因为它们不是TRUE
答案 1 :(得分:1)
问题是测试,x$b<9
。将值与NA进行比较会返回NA,这不是您想要的:
x$b<9
## [1] TRUE NA NA NA NA TRUE TRUE FALSE FALSE FALSE
请改为尝试:
x[!is.na(x$b) & x$b<9, ]
答案 2 :(得分:0)
这是您应该期望的确切行为。 NA
是一个逻辑值,基本上意味着不能进行比较。因此,当您进行比较NA < 9
时,答案是无法进行比较。 NA
不是数字,那么如何将非数字与数字进行比较?因此,当您将该逻辑向量传递到data.frame
时,当它到达存在NA
的点时,它会将其子集化,它基本上会做同样的事情。它说“这既不应该在这里也不应该在这里(即不是TRUE
或FALSE
)它有些不同,它是NA
”所以它会返回NA
地方。你可以避免这样:
x[which(x$b<9), ]
which()
只返回TRUE
的索引。