Свертывание последовательных дат в один ряд - PullRequest
0 голосов
/ 12 декабря 2018

Я видел много потоков о том, как объединить последовательные даты в одну строку, и перепробовал несколько из них (включая this и использование lead из dplyr), но до сих пор не нашелпоток, который конкретно отвечает на мой вопрос.

Вот как выглядят мои данные:

df <- data.frame(
    id = c("A", "A", "A", "B", "B", "C", "C", "C"),
    start = as.Date(c("2013-05-21", "2014-03-17", "2014-12-12", "2009-03-08", 
                      "2011-07-30", "2008-10-07", "2009-11-21", "2010-12-01")),
    end = as.Date(c("2014-03-16", "2014-12-11", NA, "2011-07-14", 
                    NA, "2009-11-20", NA, NA)),
    status = c("expired", "expired", "active", "expired", 
               "active", "expired", "expired", "active")
    )

И ниже мой желаемый вывод:

id          start          end          status
A           2013-05-21     NA           active
B           2009-03-08     2011-07-14   expired
B           2011-07-30     NA           active
C           2008-10-07     NA           active 

Итак, что я хочуdo состоит из трех частей:

1) Если строки являются последовательными, то есть дата окончания + 1 - это дата начала следующей строки, я бы хотел свернуть их в одну строку (как в идентификаторе A)

2) Если строки не являются последовательными, то есть конечная дата + 1 НЕ является начальной датой следующей строки, я бы хотел оставить их отдельно (как в идентификаторе B)

3) Если«истекшие» строки не имеют конечной даты, я все же хотел бы свернуть их в одну строку (как в id C)

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 13 декабря 2018

Вы могли бы пойти что-то вроде:

library(tidyverse)

df %>%
  group_by(id) %>%
  mutate(
    end = if_else(is.na(end), lead(start), end),
    flag = if_else(start <= lag(end) + 1, 0, 1),
    flag = if_else(is.na(flag), 0, flag),
    group = cumsum(flag),
    flag = NULL
  ) %>%
  group_by(id, group) %>%
  mutate(
    start = first(start),
    end = last(end),
    status = last(status)
  ) %>% ungroup() %>% 
  distinct(id, start, end, status)

Вывод:

# A tibble: 4 x 4
  id    start      end        status 
  <fct> <date>     <date>     <fct>  
1 A     2013-05-21 NA         active 
2 B     2009-03-08 2011-07-14 expired
3 B     2011-07-30 NA         active 
4 C     2008-10-07 NA         active 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...