【问题标题】:R Group ID's with overlapping time intervals具有重叠时间间隔的 R 组 ID
【发布时间】:2018-05-12 03:35:57
【问题描述】:

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

我有什么...

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 的间隔,并以这种方式找到重叠,但没有运气。任何帮助将不胜感激。

【问题讨论】:

    标签: r


    【解决方案1】:

    按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) )) }
    

    【讨论】:

    • 这确实回答了我的问题,谢谢,但是您知道如何修改它以使用一个组中的 3 个 ID 和另一个组中的 2 个 ID?
    • 创建一个接受两个日期时间向量并返回一个 grp 向量的函数一点也不难。然后使用 by() 函数或 lapply(split(...)) 在因子分组中运行该函数。在基础 R 数据管理中将生成的分离数据帧绑定在一起的常用方法是对结果运行 do.call(rbind, ...)。肯定有 dplyr 策略也可以进行相同的操作,但我是一个“传统主义者”。在 SO 中搜索“[r] 在组内应用函数”。
    • 非常感谢!感谢所有的帮助!
    猜你喜欢
    • 1970-01-01
    • 2016-12-17
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    相关资源
    最近更新 更多