基于起止时间计算班次重叠时长的高效data.table解决方案
高效计算员工班次重叠时长的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,start_time/end_time分别是班次的开始/结束时间(分钟)。需要计算每位员工与其他所有员工的班次重叠分钟数,输出格式如下:
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解决方案
# 生成所有员工的两两配对(含自身) DT_pair <- DT[DT, on = .(), allow.cartesian = TRUE] # 计算每对的重叠时长:取两个班次的结束时间最小值减去开始时间最大值,负数则取0 DT_pair[, overlap := pmax(0, pmin(end_time, i.end_time) - pmax(start_time, i.start_time))] # 转换为宽格式,列名格式为emp_XXX result <- dcast(DT_pair, emp ~ paste0("emp_", i.emp), value.var = "overlap")
运行后即可得到目标格式的结果。该方案利用data.table的高效连接和重塑功能,即使面对大量员工数据也能保持良好性能。
内容的提问来源于stack exchange,提问作者plausibly_exogenous
相关产品推荐
相关产品推荐

