r - 为什么 dplyr 的过滤器会从因子变量中删除 NA 值?

标签 r dplyr subset na

当我使用 dplyr 包中的 filter 来删除因子变量的级别时,filter 也会删除 NA值。这是一个例子:

library(dplyr)
set.seed(919)
(dat <- data.frame(var1 = factor(sample(c(1:3, NA), size = 10, replace = T))))
#    var1
# 1  <NA>
# 2     3
# 3     3
# 4     1
# 5     1
# 6  <NA>
# 7     2
# 8     2
# 9  <NA>
# 10    1

filter(dat, var1 != 1)
#   var1
# 1    3
# 2    3
# 3    2
# 4    2

这看起来并不理想——我只想删除 var1 == 1 的行。

看起来发生这种情况是因为任何 comparison with NA returns NA ,然后过滤掉它。因此,例如,filter(dat, !(var1 %in% 1)) 会产生正确的结果。但是有没有办法告诉 filter 不要删除 NA 值?

最佳答案

你可以使用这个:

 filter(dat, var1 != 1 | is.na(var1))
  var1
1 <NA>
2    3
3    3
4 <NA>
5    2
6    2
7 <NA>

但事实并非如此。

同样为了完成,删除 NA 是 filter 的预期行为,如下所示:

test_that("filter discards NA", {
  temp <- data.frame(
    i = 1:5,
    x = c(NA, 1L, 1L, 0L, 0L)
  )
  res <- filter(temp, x == 1)
  expect_equal(nrow(res), 2L)
})

上面的测试取自 githubfilter 测试。 .

关于r - 为什么 dplyr 的过滤器会从因子变量中删除 NA 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32908589/

相关文章:

mysql - 使用 RMySQL 关闭事件连接

r - 如何使用osmar提取osm数据

r - 如何在具有可扩展行的响应式(Reactive)中从嵌套的 tibble 打印 ggplot 对象?

r - 使用 mutate_if 和 force_tz 更改所有时间戳的时区

r - 如何使用 LyX 设置 R?

r - 仅当同一列的组中存在另一个值时,dplyr 才对值进行过滤

r - 改进group_by和summary的运行时间

r - 对两个具有交换行/列的不同数据帧进行 t 检验?

r - R中的子集列表

scala - 将 MongoDB 文档映射到具有类型但没有嵌入文档的案例类