子集R数据帧导致神秘的NA行

时间:2013-01-10 15:42:20

标签: r subset reshape na

我遇到了我认为的错误。这不是什么大问题,但我很好奇是否有其他人看过这个。不幸的是,我的数据是保密的,所以我必须做一个例子,它不会有很大帮助。

在对我的数据进行子集化时,我偶尔会得到不在原始数据框中的神秘NA行。甚至rownames都是NA。 EG:

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's read.xlsx package 导入原始数据集然后在子集化之前执行从长到长的重塑这一事实有关。

由于

7 个答案:

答案 0 :(得分:38)

将条件包裹在which

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

工作原理:

它返回条件匹配的行号(条件为TRUE)并相应地在这些行上设置数据框。

说:

which(df$number1 < df$number2)

返回行号12345

因此,写作:

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

与写作相同:

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

或者更简单的版本是:

df[1:5, ]

答案 1 :(得分:24)

我看到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会导致R将整行重写为NA。尽管如此,仍保持数据框尺寸。这是我的修复,需要知道哪个列包含NA s:

> 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

答案 2 :(得分:11)

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

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

NA排除了。

答案 3 :(得分:4)

使用dplyr:

library(dplyr)
filter(df, number1 < number2)

答案 4 :(得分:3)

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

答案 5 :(得分: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

答案 6 :(得分:0)

另一个原因可能是您的条件错误,例如检查因子列是否等于不属于其级别的值。困扰我一段时间。