如果列包含NA,如何对data.frame进行子集化

时间:2018-01-23 14:17:34

标签: r dataframe

R(版本3.3.3)在基于字符列的条件上对数据帧进行子集化时给出了一些意外行为。这是一个例子:

foo <- data.frame(bar = c('a',NA,'b','a'),
                  baz = 1:4,
                  stringsAsFactors = FALSE)

foo看起来像这样:

   bar baz
1    a   1
2 <NA>   2
3    b   3
4    a   4

我希望将此数据框的所有行都放在bar != "a",所以我调用:

foo[foo$bar != 'a', ]

返回:

    bar baz
NA <NA>  NA
3     b   3

我不明白为什么第二列中的第一个条目是NA而不是2。请帮我解释这个奇怪的行为。

1 个答案:

答案 0 :(得分:2)

虽然我试图理解行为,但在R中进行字符过滤的正确/更好的方法是使用%in%运算符。

foo <- data.frame(bar = c('a',NA,'b','a'),
                  baz = 1:4,
                  stringsAsFactors = FALSE)

foo[!(foo$bar %in% 'a'), ]

输出:

> foo[!(foo$bar %in% 'a'), ]
   bar baz
2 <NA>   2
3    b   3

更新

由于字符过滤器,行为不是。实际上,因为NA用于索引数据帧。

> foo[c(F,NA,T,F),]
    bar baz
NA <NA>  NA
3     b   3

NA作为索引值传递,只用NA替换该位置的任何值

> foo[NA,]
      bar baz
NA   <NA>  NA
NA.1 <NA>  NA
NA.2 <NA>  NA
NA.3 <NA>  NA
> foo[c(T,NA),]
      bar baz
1       a   1
NA   <NA>  NA
3       b   3
NA.1 <NA>  NA