R условие строки фильтра dplyr для нескольких столбцов

#r #tidyverse

#r #tidyverse

Вопрос:

У меня есть df, такой как

 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)
  

Как я могу фильтровать переменные от v2 до v5, если у них есть «X». Я видел несколько примеров использования filter at, но они, похоже, работают только для числовых условий.

 filter_at(vars(contains("prefix")), all_vars(.>5))
  

и замена >5 на «X» не работает

Ответ №1:

С dplyr 1.0.4 мы можем использовать 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
  

Ответ №2:

Вы можете использовать filter_at with any_vars для выбора строк, которые имеют хотя бы одно значение "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
  

Однако, filter_at было заменено, поэтому, чтобы перевести это в across , вы можете сделать :

 df %>% filter(Reduce(`|`, across(v2:v5, ~. == 'X')))
  

Это также проще в базовом R :

 df[rowSums(df[-1] == 'X') > 0, ]