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
。请帮我解释这个奇怪的行为。
答案 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