仅当在R

时间:2019-05-30 15:26:34

标签: r filter multiple-conditions

我正在尝试从调查答复数据表中删除行。我只想在满足所有指定条件的地方删除行。例如,如果三列包含NA,那么我要删除整行。但是,如果那些相同列中只有一两列包含可接受的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

1 个答案:

答案 0 :(得分:2)

一种选择是使用filter_at并为行中所有非NA元素的条件检查指定any_vars

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))