R 当筛选不等于某个值时,筛选器将删除NAs
这是R 当筛选不等于某个值时,筛选器将删除NAs,r,dplyr,R,Dplyr,这是dplyr中的过滤器的预期行为吗?听起来很可怕。我是遗漏了什么,还是版本错了 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.
dplyr
中的过滤器的预期行为吗?听起来很可怕。我是遗漏了什么,还是版本错了
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’
mydf它就在?dplyr
的文档中(尽管它似乎只是添加到文档中):
使用filter()查找条件为真的行/案例。与基本子集不同,条件计算结果为NA的行将被删除
这与base::subset()
的工作方式一致,但与[
+逻辑索引的子集工作方式不一致
正如@akrun在评论中所说,您可以使用filter(mydf,y!='a'| is.na(y))
来保存na
值。如果能够使用idential()
或isTRUE()
,那就太好了,但它们不是矢量化的。您可以编写一个方便的包装器:
eq <- function(x,c) {x==c | is.na(x)}
filter(mydf,eq(y,"a"))
eqfilter
已经以这种方式使用了很长时间,您可能需要filter(mydf,y!=“a”| is.na(y))
我刚刚用r3..1.3
和dplyr\u 0.4.3
进行了检查,它提供了与您的SOMG相同的输出-我不知道我在没有意识到这种行为的情况下在代码中引入了多少bug。