R data.table: condições baseadas em linhas dividem / aplicam / combinam

Tenho o seguintedata.table

initial.date <- as.POSIXct('2018-10-27 10:00:00',tz='GMT')
last.date <- as.POSIXct('2018-12-28 17:00:00',tz='GMT') 
    PriorityDateTime=seq.POSIXt(from=initial.date,to = last.date,by = '30 sec')
    TradePrice=seq(from=1, to=length(PriorityDateTime),by = 1)
    ndf<- data.frame(PriorityDateTime,TradePrice)
    ndf$InstrumentSymbol <- rep_len(x = c('asset1','asset2'),length.out = length(ndf$PriorityDateTime))
    ndf$id <- seq(1:length(x = ndf$InstrumentSymbol))
    ndf$datetime <- ymd_hms(ndf$PriorityDateTime)
    res <- ndf %>% data.table()

Parece assim:

    > res
         PriorityDateTime TradePrice InstrumentSymbol   id            datetime
   1: 2018-10-27 10:00:00          1           asset1    1 2018-10-27 10:00:00
   2: 2018-10-27 10:00:30          2           asset2    2 2018-10-27 10:00:30
   3: 2018-10-27 10:01:00          3           asset1    3 2018-10-27 10:01:00
   4: 2018-10-27 10:01:30          4           asset2    4 2018-10-27 10:01:30
   5: 2018-10-27 10:02:00          5           asset1    5 2018-10-27 10:02:00

Usingdata.table qual é a maneira mais elegante e rápida de:

Dividido:Para cada linha define as outras linhas que têm umdatetime no máximo 60 segundos no passado ou no futuro (diferença de tempo menor que 60 segundos) e ter o mesmoInstrumentSymbol como esta linha.Aplique: entre essas linhas estreitas, qual delas tem aTradePrice para esta linhaTradePrice[i]: pegue oindex no originaldata.frame e aTradePrice desta outra linha Combine: recombine os resultados como novas colunas para o @ origindata.table por exemplo, como novas colunasindex.minpricewithin60 eminpricewithin60

Exemplo do resultado:

> res
         PriorityDateTime TradePrice InstrumentSymbol   id            datetime minpricewithin60 index.minpricewithin60
   1: 2018-10-27 10:00:00          1           asset1    1 2018-10-27 10:00:00                2                      2
   2: 2018-10-27 10:00:30          2           asset2    2 2018-10-27 10:00:30                4                      4
   3: 2018-10-27 10:01:00          3           asset1    3 2018-10-27 10:01:00                1                      1
   4: 2018-10-27 10:01:30          4           asset2    4 2018-10-27 10:01:30                2                      2
   5: 2018-10-27 10:02:00          5           asset1    5 2018-10-27 10:02:00                3                      3

Embase Eu posso consertar uma linha e usá-la para condições. Por exemplo, se eu quiser obter o primeiroTradePrice Ondeid é o mesmo que @ desta linid, Eu posso fazerapply(df,1, function(x) df$TradePrice[which(df$id==x["id"])[1]]). Poderia explicar comodata.tables junções de @ (por exemplo) podem obter o mesmo?

EDIT: Os dados agora são maiores, qualquer resposta que eu possa executar no meu PC decente (i7 4750 2B, 12 GB de RAM) em menos de 2,5 minutos será considerada. Felicidades

questionAnswers(4)

yourAnswerToTheQuestion