我正在尝试从调查答复数据表中删除行。我只想在满足所有指定条件的地方删除行。例如,如果三列包含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
答案 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))