Найти время начала и окончания перекрывающихся и не перекрывающихся периодов с помощью факторной переменной - PullRequest
0 голосов
/ 04 октября 2018

Этот вопрос следует из более раннего: Как объединить 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, но это не дало мне все время непересекающихся усилий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...