【问题标题】:How to compute overlapping time intervals between groups如何计算组之间的重叠时间间隔
【发布时间】:2021-07-23 08:20:31
【问题描述】:

我有一个包含组 ID、开始时间和结束时间的数据框。我想计算组之间的重叠时间间隔。这是数据集的示例;

id <- c("a","a","b","c","c")
start_time <-as.POSIXct(c("2016-05-27 09:30:00","2016-05-27 15:30:00",
                          "2016-05-27 14:30:00","2016-05-27 09:40:00","2016-05-27 15:00:00"),tz= "UTC")
end_time <-as.POSIXct(c("2016-05-27 10:30:00","2016-05-27 17:30:00",
                        "2016-05-27 16:30:00","2016-05-27 09:50:00","2016-05-27 16:00:00"),tz= "UTC")

df <- data.frame(id,start_time,end_time)

示例数据框如下所示:

            ID             start_time           end_time
1           a        2016-05-27 09:30:00    2016-05-27 10:30:00
2           a        2016-05-27 15:30:00    2016-05-27 17:30:00
3           b        2016-05-27 14:30:00    2016-05-27 16:30:00
4           c        2016-05-27 09:40:00    2016-05-27 09:50:00
5           c        2016-05-27 15:00:00    2016-05-27 16:00:00

建议的数据框的期望结果是

            ID_1             ID_2        overlap
1           a                 b         0 + 60 mins
2           a                 c        10 + 0 + 0 + 30 mins
3           b                 c         0 + 60 mins

最后一列不必显示所有案例。这只是为了帮助您理解。是否有办法通过比较所有时间间隔来计算组之间的总重叠时间?

【问题讨论】:

    标签: r dataframe time overlap


    【解决方案1】:

    这里是:

    
    
    library(magrittr)
    library(lubridate)
    library(tidyr)
    
    df %<>% mutate( interval = interval( start_time, end_time ) )
    
    df %>% full_join( df, by=character(), suffix=c("_1","_2") ) %>%
        mutate( overlap = lubridate::intersect( interval_1, interval_2 ) ) %>%
        filter( id_1 < id_2 ) %>%
        replace_na( list(overlap=0) ) %>%
        group_by( id_1, id_2 ) %>%
        summarise( overlap = paste(paste( as.numeric( overlap ) / 60, collapse=" + " ),"mins"))
    
    

    各种润滑功能是解决方案的关键,其余的只是基础设施

    输出:

    
      id_1  id_2  overlap              
      <chr> <chr> <chr>                
    1 a     b     0 + 60 mins          
    2 a     c     10 + 0 + 0 + 30 mins
    3 b     c     0 + 60 mins  
    
    

    【讨论】:

    • 请注意,您的输入数据中可能有错字,它在第 2 行 end_time 上显示 2015,肯定应该是 2016
    • 感谢您提供如此出色的答案并找到错字!我纠正错字。因为我不熟悉 lubridate 功能,所以我一直在努力。我实际上要求最后一列是得到值的总和,但我认为我可以处理它。谢谢@Sirius!
    • 运行代码时,我收到一条错误消息,提示“错误:by 必须指定要加入的变量。”我是否遗漏了代码中的某些内容?
    • 可能需要更新 dplyr 以允许加入一个空字符(),这是这里的关键
    • 感谢您对问题的快速且完全正确的评论。我解决了这个问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-01
    相关资源
    最近更新 更多