2016-09-29 2 views
0

Я пытаюсь объединить два набора данных, где один набор данных содержит переменную 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 

ответ

1

Это работает?

dataC <- merge(dataA,dataB, by="id") 
dataC[dataC$dataDtTm >= dataC$startDtTm & dataC$dataDtTm <= dataC$endDtTm,] 
+0

Спасибо! Я не знаю, почему я не мог думать об этом –

Смежные вопросы