Как объединить строки на основе двух переменных даты и времени в R

Я хотел бы объединить строки в наборе данных df таким образом, чтобы для каждого идентификатора записи, если End_Dateстроки равно Start_Date следующей строки, я хотел бы их объединить.

Текущая логика, о которой я думаю, состоит в том, чтобы сначала сгруппировать по идентификатору, а затем перейти от строки 1 к строке n(). Если End_Date строки 1 равно Start_Date строки 2, замените End_Date строки 1 на End_Date строки 2 и удалите строку 2. Затем сравните строку 1 с новой строкой 2 и так далее.

Очень ценю любую помощь или предложения о том, как написать код для этого. Благодарю вас!

df <- read.table(text = "
ID  Start_Date  End_Date
1   09/09/2016  11/09/2016
1   11/09/2016  17/09/2016
1   17/09/2016  23/11/2016
1   23/11/2016  28/11/2016
1   28/11/2016  14/12/2016
1   14/12/2016  22/12/2016
1   22/12/2016  23/12/2016
1   25/12/2016  03/01/2017
1   06/01/2017  07/02/2017
1   07/02/2017  22/02/2017
1   22/02/2017  27/02/2017
1   28/03/2017  30/05/2017
1   12/06/2017  03/07/2017
1   03/07/2017  04/07/2017
1   14/08/2017  14/08/2017
1   15/08/2017  23/08/2017
1   23/08/2017  24/08/2017
1   24/08/2017  28/08/2017
1   07/09/2017  07/09/2017
1   24/09/2017  24/09/2017
1   01/10/2017  08/11/2017
1   08/11/2017  31/12/2017
2   08/08/2017  10/08/2017
2   10/08/2017  11/08/2017", stringsAsFactors = FALSE, header = TRUE)

Выходные данные должны выглядеть так:

df_new <- read.table(text = "
ID  Start_Date  End_Date
1   09/09/2016  23/12/2016
1   25/12/2016  03/01/2017
1   06/01/2017  27/02/2017
1   28/03/2017  30/05/2017
1   12/06/2017  04/07/2017
1   14/08/2017  14/08/2017
1   15/08/2017  28/08/2017
1   07/09/2017  07/09/2017
1   24/09/2017  24/09/2017
1   01/10/2017  31/12/2017
2   08/08/2017  11/08/2017", stringsAsFactors = FALSE, header = TRUE)

person Erika Sama    schedule 19.12.2017    source источник
comment
Возможно, вам поможет свернуть строки с перекрывающимися диапазонами и ссылки в них.   -  person Henrik    schedule 19.12.2017


Ответы (1)


Вот решение dplyr:

df %>%
  mutate(collapse = Start_Date == lag(End_Date),
         group = cumsum(c(0, tail(!collapse, -1)))) %>%
  group_by(group) %>%
  summarise(Start_Date = first(Start_Date),
            End_Date = last(End_Date)) %>%
  select(Start_Date, End_Date)

Я призываю вас запустить эту строку за строкой, чтобы проверить, что происходит!

Во-первых, он создает новый столбец collapse, что верно, если начальная дата записи равна конечной дате предыдущей записи. Поскольку для первой строки нет предыдущей записи, вы получите NA в строке номер 1.

Затем создается новый столбец group путем получения кумулятивной суммы столбца свертывания, но NA в первой строке обрезается и заменяется на 0. Сворачивание необходимо сбросить, потому что нам нужны только значение, которое будет увеличиваться, когда мы сталкиваемся со строкой, которую не следует объединять.

Наконец, групповой столбец позволяет нам выполнить простую группировку и подвести итоги. В этом случае я проигнорировал столбец ID.

(Это также предполагает, что ваши данные хорошо упорядочены, и вы не беспокоитесь о перекрывающихся диапазонах дат).

person Callum Webb    schedule 19.12.2017