R组ID具有重叠的时间间隔

时间:2018-05-10 18:31:41

标签: r

我有一个包含多个组的大型数据集,其中ID为数据集,包含Start&停止日期时间。我想要做的是在每个组内确定子组发生的位置。组内的一个子组是两个ID与其START& END日期时间列。下面是在R中为一个组创建样本数据集的脚本。我想要做的是在每个组内创建一个名为“Grp”的列,该列将这些子组分组,重叠START&结束日期时间。

我有什么......

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 :(得分:2)

按START排序后,新组的条件是前一行的END小于下一组的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) )) }