R сохранение первых/последних дат в двух группах

#r #dplyr

Вопрос:

У меня есть набор данных, аналогичный приведенному ниже:

 id date event 1 01/02/2016 paracetamol 1 02/03/2016 paracetamol 1 16/04/2015 ibuprofen 2 01/03/2018 paracetamol 2 10/03/2018 codeine 2 15/02/2019 codeine 2 22/02/2019 codeine  

И я хочу, чтобы:

  1. создайте две колонки, содержащие первый и последний экземпляры каждого события и для каждого человека
  2. удалите повторяющиеся события внутри каждого человека

В результате чего ниже:

 id event first_event last_event 1 paracetamol 01/02/2016 02/03/2016 1 ibuprofen 16/04/2015 16/04/2015 2 paracetamol 01/03/2018 01/03/2018 2 codeine 10/03/2018 22/02/2019  

Есть какие-нибудь предложения о том, как этого добиться? Я играл с такими функциями , как group_by и arrange , но, похоже, не могу правильно подобрать комбинацию.

Ответ №1:

Мы можем сначала преобразовать «дату» в Date класс и получить min/max «дату» после группировки по столбцам

 library(dplyr) library(lubridate) df1 %gt;%  mutate(date = dmy(date)) %gt;%  group_by(id, event) %gt;%  summarise(first_event = min(date), last_event = max(date), .groups = 'drop')  

-выход

 # A tibble: 4 × 4  id event first_event last_event  lt;intgt; lt;chrgt; lt;dategt; lt;dategt;  1 1 ibuprofen 2015-04-16 2015-04-16 2 1 paracetamol 2016-02-01 2016-03-02 3 2 codeine 2018-03-10 2019-02-22 4 2 paracetamol 2018-03-01 2018-03-01  

данные

 df1 lt;- structure(list(id = c(1L, 1L, 1L, 2L, 2L, 2L, 2L), date = c("01/02/2016",  "02/03/2016", "16/04/2015", "01/03/2018", "10/03/2018", "15/02/2019",  "22/02/2019"), event = c("paracetamol", "paracetamol", "ibuprofen",  "paracetamol", "codeine", "codeine", "codeine")),  class = "data.frame", row.names = c(NA,  -7L))