当我使用 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)
})
上面的测试取自 github 的 filter
测试。 .
关于r - 为什么 dplyr 的过滤器会从因子变量中删除 NA 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32908589/