Reputation: 1572
I have a df such as
df <-read.table(text="
v1 v2 v3 v4 v5
1 A B X C
2 A B C X
3 A C C C
4 B D V A
5 B Z Z D", header=T)
How can I filter variables v2 to v5 if they have an "X". I've seen some examples using filter at but those seem to work only for numeric conditions.
filter_at(vars(contains("prefix")), all_vars(.>5))
and replacing >5 for "X" does not work
Upvotes: 3
Views: 1428
Reputation: 886938
With dplyr
1.0.4, we can use if_any
library(dplyr)
df %>%
filter(if_any(v2:v5, ~ . == 'X'))
# v1 v2 v3 v4 v5
#1 1 A B X C
#2 2 A B C X
Upvotes: 4
Reputation: 388817
You can use filter_at
with any_vars
to select rows that have at least one value of "X"
.
library(dplyr)
df %>% filter_at(vars(v2:v5), any_vars(. == 'X'))
# v1 v2 v3 v4 v5
#1 1 A B X C
#2 2 A B C X
However, filter_at
has been superseeded so to translate this into across
you can do :
df %>% filter(Reduce(`|`, across(v2:v5, ~. == 'X')))
It is also easier in base R :
df[rowSums(df[-1] == 'X') > 0, ]
Upvotes: 2