【发布时间】:2015-12-30 17:56:52
【问题描述】:
当我使用 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 丢弃。因此,例如,filter(dat, !(var1 %in% 1)) 会产生正确的结果。但是有没有办法告诉filter 不要删除NA 值?
【问题讨论】:
-
@akrun 出于某种原因,我没有收到此通知:P。好吧,我认为 OP 已经知道这一点,正如他提到的
filter(dat, !(var1 %in% 1))相似,但我认为这是使用dplyr::filter的唯一方法。 -
我认为没有办法明确告诉
filter不要删除NA值,但一般来说,逻辑 NA 查询可以使用基本%in%运算符直观地处理,它是否定,定义为%ni% <- Negate('%in%')。因此,您可以使用filter(dat, var1 %ni% 1),它会起作用。见stackoverflow.com/a/11303276/4269699 和stackoverflow.com/a/27015823/4269699 -
是的,我确实知道这种方法和@LyzanderR 用于回答的方法。看起来过滤器没有“keep NA”的明确选项,所以这些解决方法会很好。感谢您的帮助。
-
啊,这发生在我身上,我疯了,试图理解为什么我丢失了这么多数据。同意这似乎并不理想......