Фильтруйте фрейм данных, чтобы сохранить строки, пока значения столбцов не изменятся на 0 - PullRequest
0 голосов
/ 30 марта 2020

У меня есть этот фрейм данных,

`df <- tibble(
  key = rep(1:3, c(8,4,5)),
  Date = c(seq(as.Date('2016-12-17'), as.Date('2016-12-19'), '1 day'),
       seq(as.Date('2016-12-21'), as.Date('2016-12-23'), '1 day'),
       seq(as.Date('2016-12-29'), as.Date('2016-12-30'), '1 day'),
       seq(as.Date('2017-05-18'), as.Date('2017-05-21'), '1 day'),
       seq(as.Date('2017-05-18'), as.Date('2017-05-20'), '1 day'),
       seq(as.Date('2017-05-23'), as.Date('2017-05-24'), '1 day')),
  flag= c(1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,0,1)
  )` 

Для каждого «Ключа» мне нужно максимальное значение «Дата», прежде чем «Флаг» в первый раз станет равным 0 или, если флаг 0 отсутствует для «Ключа» затем верните максимальное значение «Дата».

Мне нужен следующий вывод.

key Date        flag
 1 2016-12-19     1
 2 2017-05-21     1
 3 2017-05-20     1

Может ли кто-нибудь помочь мне с этим?

Спасибо.

1 Ответ

0 голосов
/ 30 марта 2020

в приведенном ниже коде я использую тот факт, что совпадение возвращает позицию первого совпадения. Затем я создаю дополнительный столбец с индексом строк, чтобы можно было отфильтровать все строки после первого появления flag = 1

df %>% 
  group_by(key) %>% 
  arrange(Date) %>% 
  mutate(idx = 1:n()) %>% 
  filter(idx < match(0,flag) | is.na(match(0,flag))) %>% 
  summarise(Date = max(Date))

Надеюсь, это поможет !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...