子集化R数据帧中的奇怪行为

时间:2014-06-12 20:22:16

标签: r

以下是测试:

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。

3 个答案:

答案 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的点时,它会将其子集化,它基本上会做同样的事情。它说“这既不应该在这里也不应该在这里(即不是TRUEFALSE)它有些不同,它是NA”所以它会返回NA地方。你可以避免这样:

x[which(x$b<9), ]

which()只返回TRUE的索引。