#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
И я хочу, чтобы:
- создайте две колонки, содержащие первый и последний экземпляры каждого события и для каждого человека
- удалите повторяющиеся события внутри каждого человека
В результате чего ниже:
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))