переменная фильтра на основе значения предыдущей даты в r - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть фрейм данных, как показано ниже:

df <- structure(list(id = c("555900339", "555900339", "555900339", 
                               "555900339", "555900339", "555900327", "555900327", "555900327", 
                               "555703505", "555703379", "555703379", "555703379", "555703379", 
                               "555703379", "555703366", "555702668", "555702668", "555702668", 
                               "555702668", "555702668"), date = c("20200207", "20200207", 
                                                                          "20200207", "20200208", "20200208", "20200207", "20200207", "20200207", 
                                                                          "20200207", "20200207", "20200207", "20200207", "20200207", "20200207", 
                                                                          "20200207", "20200207", "20200208", "20200208", "20200208", "20200208"
                               ), flag_code = c("SLEP", "NCHG", "MOTN", "CIHB", "NCON", "SLEP", 
                                              "NCHG", "MOTN", "INMC", "SLEP", "NCHG", "MOTN", "COFF", "NCON", 
                                              "NCHG", "SLEP", "NOMO", "NCON", "MOTN", "CIHB")), row.names = c(NA, 
                                                                                                              -20L), class = c("tbl_df", "tbl", "data.frame"))

Я хотел бы увидеть, сколько записей (уникальный идентификатор здесь) предшествовало коду флага NCHG за день до флага NCON. Мне нужно получить что-то вроде этого

  id          date flag_code
 555900339   20200207  NCHG
 555900339   20200208  NCON     
 555703366   20200207  NCHG      
 555702668   20200208  NCON 

1 Ответ

1 голос
/ 10 февраля 2020

Я чувствую, что есть более простой способ, но один из них будет:

library(dplyr)

df %>%
  mutate(date = as.Date(date, '%Y%m%d')) %>%
  filter(flag_code %in% c('NCHG', 'NCON')) %>%
  filter(
    (c(0, diff(date)) == 1 & ( (flag_code == 'NCON' & lag(flag_code) == 'NCHG') ) | 
       (lead(c(0, diff(date))) == 1 & flag_code == 'NCHG' & lead(flag_code) == 'NCON') ) )

Вывод:

# A tibble: 4 x 3
  id        date       flag_code
  <chr>     <date>     <chr>    
1 555900339 2020-02-07 NCHG     
2 555900339 2020-02-08 NCON     
3 555703366 2020-02-07 NCHG     
4 555702668 2020-02-08 NCON 
...