3

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

2 Answers 2

4

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
Sign up to request clarification or add additional context in comments.

Comments

2

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, ]

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.