R Group ID с перекрывающимися временными интервалами - PullRequest
0 голосов
/ 10 мая 2018

У меня большой набор данных с несколькими группами в наборе идентификаторов с датами начала и окончания. То, что я пытаюсь сделать, - внутри каждой группы определить, где произошла подгруппа. Подгруппа в группе будет иметь место, когда два идентификатора пересекаются со своими столбцами даты и времени начала и окончания. Ниже приведен скрипт для создания образца набора данных в R для одной группы. Что я хочу сделать, так это создать внутри каждой группы столбец с именем Grp, который группирует эти подгруппы с перекрывающимися датами начала и окончания.

Что у меня есть ...

structure(list(ID = c(1,2,3,4), START = structure(c(1490904000, 1490918400, 
1508363100, 1508379300), tzone = "UTC", class = c("POSIXct", 
"POSIXt")), END = structure(c(1492050600, 1492247700, 
1509062400, 1509031800), tzone = "UTC", class = c("POSIXct", 
"POSIXt"))), class = "data.frame", row.names = c(NA, -4L), .Names = c("ID","START", 
"END")) 

То, что я хочу, это ...

structure(list(ID = c(1,2,3,4), START = structure(c(1490904000, 1508379300, 
1508363100, 1490918400), tzone = "UTC", class = c("POSIXct", 
"POSIXt")), END = structure(c(1492050600, 1509031800, 
1509062400, 1492247700), tzone = "UTC", class = c("POSIXct", 
"POSIXt")), Grp = c(1,2,2,1)), class = "data.frame", row.names = c(NA, -4L), .Names = c("ID","START", 
"END","Grp"))

Я пытался использовать интервал lubridate и найти перекрытие таким образом, но безуспешно. Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 10 мая 2018

После сортировки по START условием для новой группы является то, что КОНЕЦ предыдущей строки меньше, чем СТАРТ следующей группы:

head(df1$END, -1) < tail(df1$START,-1)

df1 <- structure(list(ID = c(1,2,3,4), START = structure(c(1490904000, 1490918400, 
1508363100, 1508379300), tzone = "UTC", class = c("POSIXct", 
"POSIXt")), END = structure(c(1492050600, 1492247700, 
1509062400, 1509031800), tzone = "UTC", class = c("POSIXct", 
"POSIXt"))), class = "data.frame", row.names = c(NA, -4L), .Names = c("ID","START", 
"END"))

df1
  ID               START                 END
1  1 2017-03-30 20:00:00 2017-04-13 02:30:00
2  2 2017-03-31 00:00:00 2017-04-15 09:15:00
3  3 2017-10-18 21:45:00 2017-10-27 00:00:00
4  4 2017-10-19 02:15:00 2017-10-26 15:30:00


df1a <- df1[ order(df1$START), ]
df1a$grp <- cumsum( c( 1, head(df1$END, -1) < tail(df1$START,-1) ))
 df1a
#---------------
  ID               START                 END grp
1  1 2017-03-30 20:00:00 2017-04-13 02:30:00   1
2  2 2017-03-31 00:00:00 2017-04-15 09:15:00   1
3  3 2017-10-18 21:45:00 2017-10-27 00:00:00   2
4  4 2017-10-19 02:15:00 2017-10-26 15:30:00   2

Вот функция, которая отвечает на первую частьмой ответ на комментарий ниже:

grp_overlaps <- function(endings, beginnings){ 
                   cumsum(c( 1, head(endings, -1) < tail(beginnings, -1) )) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...