объединение фильтрации по нескольким критериям с использованием dplyr

#r #dplyr #dbplyr

#r #dplyr #dbplyr

Вопрос:

Я пытаюсь выполнить операцию, описанную ниже, путем создания df имени event_f .

Я хочу, чтобы из detail df критериев фильтрации все, event_id которые имеют type_id == 6 , были выбраны, за исключением тех, у которых есть комбинация 6 и 3 или 6 и 7.

Обратите внимание, что могут быть и другие комбинации, но все они должны быть включены тогда.

 library(tidyverse)
#> Warning: package 'tidyverse' was built under R version 3.5.3
#> Warning: package 'purrr' was built under R version 3.5.3


event <- tibble(id = c("00_1", "00_2", "00_3", "00_4", "00_5", "00_6", "00_7"),
                type_id = c("A", "B", "C", "B", "A", "B", "C"))


detail <- tibble(id = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L),
                 event_id = c("00_1", "00_1", "00_2", "00_2", "00_3", "00_4", "00_4", "00_5", "00_6", "00_6", "00_7", "00_8"),
                 type_id = c(3L, 4L, 6L, 7L, 2L, 6L, 3L, 2L, 6L, 5L, 2L, 1L))



event_f <- event %>%
  semi_join(detail %>% filter(event_id %in% event$id,
                              type_id == 6,
                              type_id != (7 | 3)), by = c("id" = "event_id"))
  

Создано 2019-04-01 пакетом reprex (версия 0.2.1)

Я хотел бы иметь df с одной строкой: id = "00_6" и type_id = "B" . Я полагаю, что проблема возникает из-за последних двух filter() операций, но не уверен, как их объединить?

Ответ №1:

Я думаю, вам нужно

 library(dplyr)

event %>%
   semi_join(detail %>%
               group_by(event_id) %>%
               filter(any(type_id == 6) amp; all(!type_id %in% c(3, 7))),
    by = c("id" = "event_id"))

# id    type_id
# <chr> <chr>  
#1 00_6  B     
  

Поскольку мы пытаемся найти event_id s для тех type_id , которые удовлетворяют необходимым нам критериям group_by event_id . Если мы этого не сделаем group_by , то критерии фильтрации будут применены ко всему фрейму данных вместо этого, что вернет 0 строк, поскольку у нас есть значения 3 и 7 в фрейме данных.

Комментарии:

1. Это превосходно, спасибо. Не могли бы вы объяснить, зачем вам нужно group_by здесь?

2. @MattnDo обновил ответ с некоторым объяснением.