如何仅在 R 中满足所有条件时才过滤行

How to filter rows only when all conditions are met in R

我正在尝试从 table 调查响应数据中删除行。我只想删除满足所有指定条件的行。例如,如果三列包含 NA 那么我想删除整行。但是,如果这些相同的列中只有一两个包含 NA 那就是 acceptable.

我还没有设法使用过滤器来实现这一点。如果我使用下面的代码,那么如果存在任何 NA 而不是所有

,它会删除该行
 df <- filter(df, 
              is.na(Q1) == FALSE & 
              is.na(Q2) == FALSE &
              is.na(Q3) == FALSE)

因此,如果我们有如下所示的 df,我只想删除第 2 行:

rowid    Q1      Q2     Q3
1        1       3      2
2        NA      NA     NA
3        NA      1      0
4        1       NA     2
5        1       1      NA

一个选项是使用 filter_at 并指定 any_vars 并对行中的任何 non-NA 个元素进行条件检查

library(dplyr)
df %>% 
     filter_at(vars(starts_with("Q")), any_vars(!is.na(.)))
#  rowid Q1 Q2 Q3
#1     1  1  3  2
#2     3 NA  1  0
#3     4  1 NA  2
#4     5  1  1 NA

正如 OP 特别要求的(在评论中)all_vars

df %>% 
  filter_at(vars(starts_with('Q')), all_vars(is.na(.))) %>% 
  anti_join(df, ., by = 'rowid')

或者 rowSums 来自 base R

df[ rowSums(!is.na(df[-1])) != 0,]

数据

df <- structure(list(rowid = 1:5, Q1 = c(1L, NA, NA, 1L, 1L), Q2 = c(3L, 
NA, 1L, NA, 1L), Q3 = c(2L, NA, 0L, 2L, NA)), class = "data.frame",
row.names = c(NA, 
-5L))