Я пытаюсь объединить два набора данных, где один набор данных содержит переменную datetime (dataA
), а другой набор содержит время начала и остановки (dataB
). Я хочу взять все время от времени начала и остановки. Я придумал простое решение, но для набора данных требуется около 3 часов с около миллиона наблюдений. Может ли кто-нибудь предложить более быстрое решение? Ниже приведен пример моего решения; он хорошо работает для небольших размеров выборки, но уменьшение secBetwMeas
значительно увеличивает время вычисления (установка secBetwMeas=5
занимает почти 40 секунд).Время слияния между событиями запуска и остановки в R
secBetwMeas <- 5*60
dataA <- data.frame(id=c(rep("A",length(seq(as.POSIXct("2014-01-01 01:00:00", format="%Y-%m-%d %H:%M:%S"),as.POSIXct("2014-01-02 04:00:00", format="%Y-%m-%d %H:%M:%S"), by=secBetwMeas))),
rep("B",length(seq(as.POSIXct("2014-06-01 04:00:00", format="%Y-%m-%d %H:%M:%S"),as.POSIXct("2014-06-02 05:00:00", format="%Y-%m-%d %H:%M:%S"), by=secBetwMeas)))),
dataDtTm=c(seq(as.POSIXct("2014-01-01 01:00:00", format="%Y-%m-%d %H:%M:%S"),
as.POSIXct("2014-01-02 04:00:00", format="%Y-%m-%d %H:%M:%S"), by=secBetwMeas),
seq(as.POSIXct("2014-06-01 04:00:00", format="%Y-%m-%d %H:%M:%S"),
as.POSIXct("2014-06-02 05:00:00", format="%Y-%m-%d %H:%M:%S"), by=secBetwMeas)))
dataB <- data.frame(id=rep(c("A","B"),each=2),
startDtTm=c(as.POSIXct("2014-01-01 01:10:00", format="%Y-%m-%d %H:%M:%S"),
as.POSIXct("2014-01-02 03:05:00", format="%Y-%m-%d %H:%M:%S"),
as.POSIXct("2014-06-01 04:30:00", format="%Y-%m-%d %H:%M:%S"),
as.POSIXct("2014-06-01 22:10:00", format="%Y-%m-%d %H:%M:%S")),
endDtTm=c(as.POSIXct("2014-01-01 08:30:00", format="%Y-%m-%d %H:%M:%S"),
as.POSIXct("2014-01-02 07:05:00", format="%Y-%m-%d %H:%M:%S"),
as.POSIXct("2014-06-01 08:30:00", format="%Y-%m-%d %H:%M:%S"),
as.POSIXct("2014-06-02 04:05:00", format="%Y-%m-%d %H:%M:%S")))
### Trying to optimize this solution: ###
dataA$endDtTm <- dataA$startDtTm <- as.POSIXct(NA)
for(i in 1:NROW(dataA)){
index <- (dataA$id[i]==dataB$id & dataA$dataDtTm[i] >= dataB$startDtTm & dataA$dataDtTm[i] <= dataB$endDtTm)
stopifnot(sum(index)==0 || sum(index)==1)
if(any(index)){
dataA$startDtTm[i] <- dataB$startDtTm[index]
dataA$endDtTm[i] <- dataB$endDtTm[index]
}
}
dataA <- na.omit(dataA)
head(dataA) #This is the dataset I want to see
Спасибо! Я не знаю, почему я не мог думать об этом –