Последовательность POSIX за счет сокращения таблицы данных - PullRequest
0 голосов
/ 11 июля 2019
library(data.table)    
set.seed(333)
t <- data.table(old=seq(from=as.POSIXct("2013-01-01"), 
                          to=as.POSIXct("2013-01-02"), by="15 mins"), 
                dif=as.difftime(sample(seq(15,120,15),97,replace=TRUE),units="mins"))
t$new <- t$old + t$dif; t$foo <- rnorm(97); t$dif <- NULL
i <- data.table(id=1:3, start=sample(seq(from=as.POSIXct("2013-01-01"), 
                                           to=as.POSIXct("2013-01-01 22:00:00"), by="15 mins"),3))

> head(t)
                   old                 new        foo
1: 2013-01-01 00:00:00 2013-01-01 01:00:00 -1.5434407
2: 2013-01-01 00:15:00 2013-01-01 00:30:00 -0.2753971
3: 2013-01-01 00:30:00 2013-01-01 02:30:00 -1.5986916
4: 2013-01-01 00:45:00 2013-01-01 02:00:00 -0.6288528
5: 2013-01-01 01:00:00 2013-01-01 01:15:00 -0.8967041
6: 2013-01-01 01:15:00 2013-01-01 02:45:00 -1.2145590

> i
   id               start
1:  1 2013-01-01 22:00:00
2:  2 2013-01-01 21:00:00
3:  3 2013-01-01 13:30:00

Эти данные показывают одну таблицу данных с временными интервалами для каждого квартала вместе с другими переменными, представленными foo. Другая таблица данных показывает для каждой id начальную точку в пределах временного окна. Как и в моем предыдущем вопросе , я хочу удалить строки из t так, чтобы только те строки остались там, где new[i] = old[i-1], давая каждому ID непрерывную последовательность n временных точек. Результат должен выглядеть следующим образом:

n=2
> ans
    id                 old                 new         foo
1:   1 2013-01-01 22:00:00 2013-01-01 23:00:00 -0.36643134  
2:   1 2013-01-01 23:00:00 2013-01-02 00:15:00  0.75903779
3:   2 2013-01-01 21:00:00 2013-01-01 22:15:00  0.98787668
4:   2 2013-01-01 22:15:00 2013-01-02 00:00:00  1.51498914
5:   3 2013-01-01 13:30:00 2013-01-01 15:30:00  1.95255430
5:   3 2013-01-01 15:30:00 2013-01-01 16:45:00  0.03339041

Мне было указано на следующее решение, которое работало с примерами данных, где моменты времени были числовыми:

set.seed(333)
t <- data.table(old=1002:2001, dif=sample(1:10,1000, replace=TRUE))
t$new <- t$old + t$dif; t$foo <- rnorm(1000); t$dif <- NULL
i <- data.table(id=1:3, start=sample(1000:1990,3))

library(igraph)
g <- graph_from_edgelist(as.matrix(t[,1:2]))
i[, t[old %in% subcomponent(g, start, "out")[1:n]], by=.(id)]

В отличие от этого, настоящая проблема имеет временные точки POSIXct, что вызывает проблемы в функции subcomponent(.). Кто-нибудь знает решение для этих обстоятельств?

PS. Извиняюсь за размещение подобных вопросов. Я думал, что оригинальный пост был достаточно общим, чтобы иметь отношение и к другим. Но оно оказалось слишком общим для моего случая.

...