Использование filter_if для фильтрации по критерию - PullRequest
1 голос
/ 09 февраля 2020

Я пытаюсь отфильтровать фрейм данных на основе столбца «тип» и применить критерии фильтра для «Дата», если «тип» соответствует. Вот пример:

df <- tibble(type = c("A","A","A","A","B","B","B","B","C","C","C","C"),
           Date = ymd(c(20190101,20190105,20190110,20191231,20190530,20190630,20190730,20180630,20190730,20190112,20191230,20181215)))

    A_date <- c(ymd(2019-01-05),ymd(2019-12-31))
    B_date <- c(ymd(2019-05-30),ymd(2019-07-30))
    C_date <- c(ymd(2019-01-01),ymd(2019-12-15))

df
# A tibble: 12 x 2
   type  Date      
   <chr> <date>    
 1 A     2019-01-01
 2 A     2019-01-05
 3 A     2019-01-10
 4 A     2019-12-31
 5 B     2019-05-30
 6 B     2019-06-30
 7 B     2019-07-30
 8 B     2018-06-30
 9 C     2019-07-30
10 C     2019-01-12
11 C     2019-12-30
12 C     2018-12-15

Я хочу применить фильтр таким образом, чтобы, если тип был "A", то фильтр для всех строк с типом "A" с датой между A_date и делал то же самое для " B "и" C ". Так что результирующий кадр данных будет:

# A tibble: 8 x 2
   type  Date      
   <chr> <date>    
 1 A     2019-01-05
 2 A     2019-01-10
 3 A     2019-12-31
 4 B     2019-05-30
 5 B     2019-06-30
 6 B     2019-07-30
 7 C     2019-07-30
 8 C     2019-01-12

Возможно ли это сделать с помощью "filter_if" tidyverse? Если нет, есть ли другие решения?

1 Ответ

0 голосов
/ 09 февраля 2020

Если вы установите начальную и конечную даты каждого фрейма данных, вы можете легко сделать это путем объединения и фильтрации.

library(dplyr)
library(lubridate)

ref <- data.frame(type= c('A', 'B', 'C'), start = ymd(c('2019-01-05', '2019-05-30', 
     '2019-01-01')), end = ymd(c('2019-12-31', '2019-07-30', '2019-12-15')))


df %>%
  left_join(ref, by  ='type') %>%
  filter(Date >= start & Date <= end) %>%
  select(type, Date)

и аналогично в базе R:

subset(merge(df, ref), Date >= start & Date <= end)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...