Групповые записи с перекрытием временного интервала - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть фрейм данных (с N = 16), содержащий идентификатор (символ), w_from (дата) и w_to (дата). Каждая запись представляет задачу.

Вот данные в R.

ID <- c(1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2)

w_from <- c("2010-01-01","2010-01-05","2010-01-29","2010-01-29",
            "2010-03-01","2010-03-15","2010-07-15","2010-09-10",
            "2010-11-01","2010-11-30","2010-12-15","2010-12-31",
            "2011-02-01","2012-04-01","2011-07-01","2011-07-01")

w_to <- c("2010-01-31","2010-01-15", "2010-02-13","2010-02-28",
          "2010-03-16","2010-03-16","2010-08-14","2010-10-10",
          "2010-12-01","2010-12-30","2010-12-20","2011-02-19",
          "2011-03-23","2012-06-30","2011-07-31","2011-07-06")

df <- data.frame(ID, w_from, w_to)
df$w_from <- as.Date(df$w_from)
df$w_to <- as.Date(df$w_to)

Мне нужно сгенерировать номер группы по идентификатору для записей, чьи интервалы времени перекрываются. Например, и в общих чертах, если запись № 1 перекрывается с записью № 2, а запись № 2 перекрывается с записью № 3, то запись № 1, запись № 2 и запись № 3 перекрываются.

Кроме того, если запись № 1 перекрывается с записью № 2 и записью № 3, но запись № 2 не перекрывается с записью № 3, то запись № 1, запись № 2, запись № 3 все перекрываются.

В приведенном выше примере и для ID = 1 первые четыре записи перекрываются.

enter image description here

Вот окончательный результат:

enter image description here

Также, если это можно сделать с помощью dplyr, это было бы здорово!

1 Ответ

1 голос
/ 19 апреля 2020

Попробуйте это:

library(dplyr)
df %>% 
  group_by(ID) %>%
  arrange(w_from) %>% 
  mutate(group = 1+cumsum(
    cummax(lag(as.numeric(w_to), default = first(as.numeric(w_to)))) < as.numeric(w_from)))

# A tibble: 16 x 4
# Groups:   ID [2]
      ID w_from     w_to       group
   <dbl> <date>     <date>     <dbl>
 1     1 2010-01-01 2010-01-31     1
 2     1 2010-01-05 2010-01-15     1
 3     1 2010-01-29 2010-02-13     1
 4     1 2010-01-29 2010-02-28     1
 5     1 2010-03-01 2010-03-16     2
 6     1 2010-03-15 2010-03-16     2
 7     1 2010-07-15 2010-08-14     3
 8     1 2010-09-10 2010-10-10     4
 9     1 2010-11-01 2010-12-01     5
10     1 2010-11-30 2010-12-30     5
11     1 2010-12-15 2010-12-20     5
12     1 2010-12-31 2011-02-19     6
13     1 2011-02-01 2011-03-23     6
14     2 2011-07-01 2011-07-31     1
15     2 2011-07-01 2011-07-06     1
16     2 2012-04-01 2012-06-30     2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...