Условная фильтрация в dplyr - PullRequest
1 голос
/ 29 апреля 2020

У меня есть фрейм данных, и я пытаюсь выполнить условное форматирование, которого я не знаю, как добиться. После запуска приведенного ниже примера кода (создание кадра данных X):

x <- data.frame(A = c("A","A","A", "B","B", "B"), B = c("X","Y", "Z", "X", "K","N"), C = c(20,30,40,40,10,50)) 

У меня есть 2 переменные A и B в столбце A и всего 6 строк (по 3 для A и B). Соответствующие значения переменной A: X, Y, Z в столбце B и 20,30,40 в столбце C. Аналогично, переменные B соответствуют значениям X, K, N в столбце B и 40,10,50 в столбце C. Я хочу выбрать только ту переменную (между A и B в этом примере), которая содержит X и 20 вместе. Так что в этом случае, поскольку переменная A имеет одно из значений X в столбце B и 20 в столбце C, я хочу, чтобы мой результирующий фрейм данных содержал только переменную A и все соответствующие ей значения, но поскольку переменная B содержит X, но «не» 20 (здесь значение X равно 40), я не хочу оставлять B. Пожалуйста, обратитесь к результирующему фрейму данных, полученному из второго кода ниже (создание фрейма данных Y).

y <- data.frame(A = c("A","A","A"), B = c("X","Y", "Z"), C = c(20,30,40)) 

Буду признателен за любую помощь в этом. Спасибо!

1 Ответ

0 голосов
/ 29 апреля 2020

Мы могли бы использовать any в filter после выполнения group_by

library(dplyr)
x %>% 
   group_by(A) %>%
   filter(any(B == 'X' & C == 20))
# A tibble: 3 x 3
# Groups:   A [1]
#  A     B         C
#  <fct> <fct> <dbl>
#1 A     X        20
#2 A     Y        30
#3 A     Z        40

Или мы можем sum логический вектор

x %>% 
   group_by(A) %>%
   filter(sum(B == 'X' & C == 20) > 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...