dplyr 过滤器保持 NAs AND OR 条件

dplyr filter keep the NAs AND OR conditions

我有以下包含 10 个条目的数据:

test_data_1 <- structure(list(Art = c(188, NA, NA, 140, NA, 182, NA, NA, 182, 
                       NA)), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"
                       ))

假设我只想保留 NA,188 和 140。所以我尝试了以下命令:

test_data_1 %>% filter(is.na(Art), Art != 182) # with | instead of a comma, it works

使用此命令,会产生一个条目为零的小标题。为什么我必须使用 |符号而不是逗号?该站点 (https://sebastiansauer.github.io/dplyr_filter/) 指出:“可以组合多个逻辑比较。只需使用逗号将它们相加即可;这相当于逻辑或“加法”:“所以逗号应该充当 OR,但它不会”吨。 另一种方法:

test_data_1 %>% filter(Art != 182)

这里dplyr默认删除了6个NAs条目,这不是我想要的。命令 na.rm=FALSE 也无济于事。现在保留零条目。这是为什么?为什么不至少保留条目 188 和 140?

test_data_1 %>% filter(Art != 182, na.rm=FALSE)

最后一个问题:如果我想在一列中保留各种数字,我可以使用 %in% 后跟一个向量,例如:

test_data_1 %>% filter(Art %in% c(140,188))

但是如果我只是想保留 NA 并且例如140?

使用 | 而不是 &。使用filter,将,分隔的多个表达式视为&。不可能有既 NA 又不等于 182

的值
library(dplyr)
test_data_1 %>% 
   filter(is.na(Art) | Art != 182)

-输出

# A tibble: 8 × 1
    Art
  <dbl>
1   188
2    NA
3    NA
4   140
5    NA
6    NA
7    NA
8    NA

问题的第二部分是%in%。我们可以再次使用|

test_data_1 %>%
   filter(Art %in% c(140,188) | is.na(Art))
# A tibble: 8 × 1
    Art
  <dbl>
1   188
2    NA
3    NA
4   140
5    NA
6    NA
7    NA
8    NA

注意:默认情况下,filter 会删除 NA 元素。另外,filter

中没有na.rm参数