【问题标题】:dplyr::filter removes NAs when filtering for not equal to a value [duplicate]dplyr::filter 在过滤不等于值时删除 NA [重复]
【发布时间】:2017-11-07 17:04:54
【问题描述】:

这是filterdplyr 中的预期行为吗?听起来很可怕。是我遗漏了什么,还是版本不对?

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’

【问题讨论】:

  • filter 已经这样很久了你可能需要filter(mydf, y != 'a' |is.na(y)) 我刚刚检查过R 3..1.3dplyr_0.4.3,它给出的输出和你的一样
  • OMG - 我不知道我在代码中引入了多少错误却没有意识到这种行为。

标签: r dplyr


【解决方案1】:

它就在?dplyr 的文档中(尽管这似乎只是添加到了9 months ago 的文档中):

使用 filter() 查找条件为真的行/案例。与基本子集不同,条件评估为 NA 的行将被删除。

这与base::subset() 的工作方式是一致的,但不是[+逻辑索引的子集如何工作。

正如@akrun 在 cmets 中所说,您可以使用 filter(mydf, y != 'a' |is.na(y)) 来保留 NA 值。能够使用identical()isTRUE() 会很好,但这些不是矢量化的。你可以写一个方便的包装器:

eq <- function(x,c) {x==c | is.na(x)}
filter(mydf,eq(y,"a"))

【讨论】:

    猜你喜欢
    • 2020-09-16
    • 2015-05-05
    • 2016-07-20
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    相关资源
    最近更新 更多