【发布时间】:2019-03-06 23:09:50
【问题描述】:
我有 2 个数据表,每个表都列出了观察努力的时期和努力的类型(A、B、C)。 我想知道重叠和非重叠工作的持续时间。
我已尝试使用 data.table 和 foverlaps 来执行此操作,但不知道如何包含所有非重叠时段。
这是我的示例数据。我首先创建了 2 个包含工作时间的数据表。我的数据集将包括单个观察者正在努力的时间段。
library(data.table)
library(lubridate)
# times have been edited so not fixed to minute intervals - to make more realistic
set.seed(13)
EffortType = sample(c("A","B","C"), 100, replace = TRUE)
On = sample(seq(as.POSIXct('2016/01/01 01:00:00'), as.POSIXct('2016/01/03 01:00:00'), by = "1 sec"), 100, replace=F)
Off = On + minutes(sample(1:60, 100, replace=T))
Effort1 = data.table(EffortType, On, Off)
EffortType2 = sample(c("A","B","C"), 100, replace = TRUE)
On2 = sample(seq(as.POSIXct('2016/01/01 12:00:00'), as.POSIXct('2016/01/03 12:00:00'), by = "1 sec"), 100, replace=F)
Off2 = On2 + minutes(sample(1:60, 100, replace=T))
Effort2 = data.table(EffortType2, On2, Off2)
#prep for using foverlaps
setkey(Effort1, On, Off)
setkey(Effort2, On2, Off2)
然后我使用 foverlaps 来查找工作重叠的位置。我设置了 nomatch=NA,但这只是给了我正确的外部连接。我想要完整的外部连接。所以我想知道更合适的功能是什么。
matches = foverlaps(Effort1,Effort2,type="any",nomatch=NA)
我继续在这里展示我是如何尝试确定所有重叠和非重叠轮班时间的持续时间的。但我认为这部分我也不对。
# find start and end of intersection of all shifts
matches$start = pmax(matches$On, matches$On2, na.rm=T)
matches$end = pmin(matches$Off, matches$Off2, na.rm=T)
# create intervals and find durations
matches$int = interval(matches$start, matches$end)
matches$dur = as.duration(matches$int)
然后我想总结每个“EffortType”分组的观察努力时间
最终得到这样的结果(数字只是示例,因为我还没有设法弄清楚如何正确计算,即使在 excel 中也是如此)
EffortType Duration(in minutes)
A 10
B 20
C 12
AA 8
BB 6
CC 1
AC 160
AB 200
BC 150
【问题讨论】:
-
您应该添加一些 library(...) 调用。
minutes不在基础 R 中 -
Effort1和Effort2内有重叠。这些应该如何处理?这些应该被EffortType折叠吗? -
我已经编辑了示例中时间的创建方式,使其更加真实。 Effort1 和 Effort2 之间可能存在重叠。这应该包含在持续时间摘要中,例如。 AA、BB 或 CC。
标签: r data.table overlap