简体   繁体   中英

R dplyr filter string condition on multiple columns

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

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM