Этот вопрос следует из более раннего: Как объединить 2 таблицы данных по временному интервалу и суммировать перекрывающиеся и не перекрывающиеся периоды времени по факторной переменной
В дополнение к длительностям (ответ на предыдущий вопрос) Я хотел бы найти время начала и окончания всех перекрывающихся и не перекрывающихся периодов.
Используя те же данные примера, что и раньше, и включая помощь, полученную по более раннему вопросу.
library( data.table )
library( lubridate )
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)
#create DT of seconds, spanning entire period - employing Wimpel's approach
dt.secs <- data.table( On = seq(min(Effort1$On, Effort2$On2),
max(Effort1$Off, Effort2$Off2)+60*60,
by= "1 sec"),
Off = seq(min(Effort1$On, Effort2$On2),
max(Effort1$Off, Effort2$Off2)+60*60,
by= "1 sec") +1)
#prep for using foverlaps
setkey(Effort1, On, Off)
setkey(Effort2, On2, Off2)
setkey(dt.secs, On, Off)
#overlap join both efforts on the dt.secs.
s1 <- foverlaps(dt.secs, Effort1 ,type="within",nomatch=0L)
s2 <- foverlaps(dt.secs, Effort2 ,type="within",nomatch=0L)
#bind together
result <- rbindlist(list(s1,s2))[, `:=`(On=i.On, Off = i.Off)][, `:=`(i.On = NULL, i.Off = NULL)]
Итак, теперь у меня есть таблица данных, в которой перечислены все секунды, на которые у меня были какие-то усилия.И я могу вычислить комбинации усилий для каждой секунды
OnDT = result[,
.(tt = paste(sort(unique(EffortType)), collapse=" "))
, keyby=On]
Но я застрял в том, как преобразовать последовательные секунды с той же комбинацией усилий в интервалы с временем начала и окончания для каждого интервала.
Если бы я использовал
matches = foverlaps(Effort1,Effort2,type="any",nomatch=0L)
Тогда я бы искал новые времена запуска и остановки для каждого интервала, используя
matches$start = pmax(matches$On, matches$i.On, na.rm=T)
matches$end = pmin(matches$Off, matches$i.Off, na.rm=T)
Я хотел бы закончить стаблица данных, которая похожа на совпадения, но также включает в себя время только с одним типом усилия.Я пытался установить no.match = NA в foverlaps, но это не дало мне все время непересекающихся усилий.