dplyr::filter在过滤不等于某个值时会移除缺失值(NA)。

4

这是 dplyr 中的 filter 函数的预期行为吗?听起来很糟糕。我是不是漏掉了什么,或者使用了错误的版本?

mydf <- data.frame(x = 1:5, y = c(letters[1:3], rep(NA, 2)))
mydf
  x    y
1 1    a
2 2    b
3 3    c
4 4 <NA>
5 5 <NA>

filter(mydf, y != 'a')
  x y
1 2 b
2 3 c

packageVersion('dplyr')
[1] ‘0.7.2

1
“filter” 这个函数已经使用很长时间了,你可能需要使用 filter(mydf, y != 'a' |is.na(y)) 进行筛选。我刚用 R 3..1.3dplyr_0.4.3 进行了验证,得到的结果和你的是一样的。 - akrun
1
天啊 - 我不知道我在我的代码中引入了多少个错误,而没有意识到这种行为。 - Gopala
1个回答

3
?dplyr的文档中已经有了相关说明(不过似乎是在9个月前才加入文档:链接):
使用filter()查找满足条件的行/案例。与基础子集不同,条件计算为NA的行会被删除。
这与base::subset()的工作方式一致,但与使用[+逻辑索引的子集方式不同。
如评论中所说,你可以使用filter(mydf, y != 'a' |is.na(y))来保留NA值。尽管使用identical()isTRUE()也很方便,但它们都不能向量化。你可以编写一个便捷的包装器:
eq <- function(x,c) {x==c | is.na(x)}
filter(mydf,eq(y,"a"))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接