Сгруппированный фильтр на основе нескольких столбцов

1

У меня есть фрейм данных с 71 группой, 4 наблюдениями на группу и 18 переменными. Я хотел бы удалить всю группу, если какое-либо наблюдение в этой группе имеет меньше определенного значения в любой из 4 различных переменных, каждая из которых содержит одну и ту же строку в своем имени. Вот упрощенная версия:

df <- data.frame(group=letters[c(1, 1, 1, 2, 2, 2, 3, 3, 3)], 
                 var.one=c(111, 100, 98, 93, 99, 101, 100, 99, 97),
                 var.two=c(102, 96, 99, 100, 101, 102, 99, 90, 101),
                 other=c(seq(1:9)))

Я хотел бы сохранить всех членов любой группы, где все переменные, содержащие «var», больше 95, и удалить всех членов любой группы, если любая переменная, содержащая «var» меньше 95. Это должно оставить меня с группой а:

group var.one var.two other
1     a     111     102     1
2     a     100      96     2
3     a      98      99     3

Я могу легко отфильтровать отдельные строки, соответствующие этим условиям, следующим образом:

df %>% filter_at(vars(contains('var')), all_vars(. >=95))

Но, конечно, это не удаляет всю связанную с ним группу. Я также могу легко исключить целые группы, которые не соответствуют одной переменной:

df %>% group_by(group) %>% filter(!any(var.one <95))

Но, конечно, это работает только для одной переменной, а не для нескольких переменных.

Как мне совместить эти два подхода?

Теги:
dplyr
CodeFix

2 ответа

2
Лучший ответ

С последней версиейdplyr , ты можешь сделать

df %>% 
   group_by(group) %>% 
   filter(across(contains('var'), ~all(.>95)))

Вacross() функция в основном заменяетfilter_at иall_vars в более поздних выпусках. Для получения дополнительной информации о функции обратитесь к?across справочная страница.

Поделиться
Источник
1

Вы можете использоватьif_all :

library(dplyr)

df %>%
  group_by(group) %>%
  filter(if_all(starts_with('var'), ~all(.x > 95))) %>%
  ungroup

#  group var.one var.two other
#  <chr>   <dbl>   <dbl> <int>
#1 a         111     102     1
#2 a         100      96     2
#3 a          98      99     3
Поделиться
Источник

Другие вопросы

CodeFix
Цитата дня

"Завидую тестировщикам: все хотят с ними дружить."

Эндрю Таненбаум