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:
datetime
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.table
s 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