我曾经在一个复杂的语句跨越dplyr::filter
的行为无意中发现了一个的大数据帧,这基本上可以归结为治疗NA
值:否定过滤条件给出与直觉相反的结果
df <- tibble(a = c(rep(1,3),
rep(NA, 3)))
A tibble: 6 x 1
a
<dbl>
1 1
2 1
3 1
4 NA
5 NA
6 NA
过滤对于等于行1给出了预期的结果:
df %>% filter(a == 1)
A tibble: 3 x 1
a
<dbl>
1 1
2 1
3 1
滤波行不等于1,我希望要返回的其余3行的东风,然而这是不是这样的,:
df %>% filter(!a == 1)
A tibble: 0 x 1
... with 1 variables: a <dbl>
因此,尽管在第一种情况下NA
被解释为不等于1,在第二种情况下,它被解释为等于1。有我在这里失踪逻辑?
我知道我可以使用%in%
来获得期望的结果:
df %>% filter(!a %in% 1)
A tibble: 3 x 1
a
<dbl>
1 NA
2 NA
3 NA
但觉得奇怪,我使用该运营商只用一个元素(而不是矢量)。
所以我的问题给专家:这是filter
的预期行为?否定过滤条件时,通常使用%in%
吗?
好吧,我明白了。所以反直觉行为(至少对我来说)是'=='在数据值为'NA'时产生'NA'。我宁愿期望'a == 1'与'NA'数据产生'FALSE',因为'NA'不等于1.我必须记住在这种否定条件下使用'%in%'。感谢您的回答! – user3460194