如何仅在 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))
我正在尝试从 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))