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