当基于字符列的条件对数据框进行子集化时,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
。请帮我解释一下这种奇怪的行为。
最佳答案
当我试图理解这种行为时,在 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
关于r - 如果列包含 NA,如何对 data.frame 进行子集化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48403916/