【问题标题】:Finding overlapped units based on start and end times根据开始和结束时间查找重叠单元
【发布时间】:2022-11-15 12:08:24
【问题描述】:

我想知道是否有针对以下问题的有效 data.table 解决方案。

假设我有以下数据集:

library(data.table)


DT <- data.table(emp = c(1,2,3),
                 start_time = c(90,90,540),
                 duration = c(480, 480,480 ))

DT[, end_time := start_time + duration]

看起来像:

     emp   start_time duration end_time
   <num>      <num>    <num>    <num>
1:     1         90      480      570
2:     2         90      480      570
3:     3        540      480     1020

这里emp是员工id,每个员工轮班的开始时间、持续时间和结束时间由三列给出。我试图在几分钟内确定每个员工之间的重叠量。因此,输出应该类似于:

     emp emp_1 emp_2 emp_3
   <num> <num> <num> <num>
1:     1   480   480    30
2:     2   480   480    30
3:     3    30    30   480

其中列基于完整的员工集。

我正在寻找一个 data.table 解决方案,因为员工人数非常多。

谢谢!

【问题讨论】:

    标签: r dplyr data.table


    【解决方案1】:

    foverlapsdcast 的一种可能解决方案:

    library(data.table)
    
    #Key needed for foverlaps
    setkey(DT,start_time,end_time)
    
    dcast(foverlaps(DT,DT)[, .(emp,i.emp,overlap=pmin(end_time,i.end_time)-pmax(start_time,i.start_time))],
          emp~i.emp,value.var = "overlap")
    
    Key: <emp>
         emp     1     2     3
       <num> <num> <num> <num>
    1:     1   480   480    30
    2:     2   480   480    30
    3:     3    30    30   480
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-02
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多