68

我一直在遇到我认为的错误。这没什么大不了的,但我很好奇是否有其他人看到过。不幸的是,我的数据是机密的,所以我必须编造一个例子,这不会很有帮助。

在对我的数据进行子集化时,我偶尔会得到原始数据框中没有的神秘 NA 行。甚至行名也是 NA。例如:

example <- data.frame("var1"=c("A", "B", "A"), "var2"=c("X", "Y", "Z"))
example

  var1 var2
1    A    X
2    B    Y
3    A    Z

然后我运行:

example[example$var1=="A",]

  var1 var2
1    A    X
3    A    Z
NA<NA> <NA>

当然,上面的例子实际上并没有给你这个神秘的 NA 行;我在这里添加它是为了说明我的数据遇到的问题。

也许这与我使用Google 的 read.xlsx 包导入我的原始数据集,然后在子集之前执行宽到长整形有关。

谢谢

4

7 回答 7

73

将条件包装在which

df[which(df$number1 < df$number2), ]

这个怎么运作:

它返回条件匹配的行号(条件为TRUE)并相应地对这些行上的数据框进行子集化。

比如说:

which(df$number1 < df$number2)

返回行号123和.45

因此,写作:

df[which(df$number1 < df$number2), ]

和写法一样:

df[c(1, 2, 3, 4, 5), ]

或者更简单的版本是:

df[1:5, ]
于 2016-05-20T16:17:11.973 回答
33

我看到 OP 已经回答了这个问题,但是由于他的评论深埋在评论部分,这是我解决这个问题的尝试(至少使用我的数据,它的行为方式相同)。

首先,一些示例数据:

> df <- data.frame(name = LETTERS[1:10], number1 = 1:10, number2 = c(10:3, NA, NA))
> df
   name number1 number2
1     A       1      10
2     B       2       9
3     C       3       8
4     D       4       7
5     E       5       6
6     F       6       5
7     G       7       4
8     H       8       3
9     I       9      NA
10    J      10      NA

现在是一个简单的过滤器:

> df[df$number1 < df$number2, ]
     name number1 number2
1       A       1      10
2       B       2       9
3       C       3       8
4       D       4       7
5       E       5       6
NA   <NA>      NA      NA
NA.1 <NA>      NA      NA

这里的问题是NA第三列中 s 的存在导致 R 将整行重写为NA。尽管如此,数据框尺寸仍然保持不变。这是我的修复,它需要知道哪一列包含NAs:

> df[df$number1 < df$number2 & !is.na(df$number2), ]
  name number1 number2
1    A       1      10
2    B       2       9
3    C       3       8
4    D       4       7
5    E       5       6
于 2014-12-15T18:56:13.320 回答
14

使用与您发布的代码类似的代码时,我遇到了同样的问题。使用函数子集()

subset(example,example$var1=="A")

NA 行反而被排除在外。

于 2014-05-07T13:58:09.490 回答
5

使用 dplyr:

library(dplyr)
filter(df, number1 < number2)
于 2017-02-28T22:42:37.453 回答
3

我发现使用 %in$ 而不是 == 可以解决这个问题,尽管我仍然想知道为什么。例如,代替: df[df$num == 1,] 使用: df[df$num %in% c(1),] 将起作用。

于 2020-05-05T07:42:04.120 回答
1
   > example <- data.frame("var1"=c("A", NA, "A"), "var2"=c("X", "Y", "Z"))
    > example
      var1 var2
    1    A    X
    2 <NA>    Y
    3    A    Z
    > example[example$var1=="A",]
       var1 var2
    1     A    X
    NA <NA> <NA>
    3     A    Z

可能这一定是您期望的结果...试试这个尝试在条件之前使用哪个条件来避免 NA

  example[which(example$var1=="A"),]
      var1 var2
    1    A    X
    3    A    Z
于 2016-10-12T09:54:44.997 回答
0

另一个原因可能是条件错误,例如检查因子列是否等于不在其级别中的值。困扰了我一阵子。

于 2016-09-20T11:10:13.260 回答