Это dplyr версия этот вопрос
У меня есть следующее data.table
initial.date <- as.POSIXct('2018-10-27 10:00:00',tz='GMT')
last.date <- as.POSIXct('2018-10-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()
Выглядит так:
> 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
Используя dplyr
, какой самый элегантный и быстрый способ:
- Разделить: Для каждой строки определить другие строки, которые имеют
datetime
не более 60 секундв прошлом или будущем (разница во времени менее 60 секунд), и имеют те же InstrumentSymbol
, что и у этой строки. - Применить: среди этих близких линий, какая из них ближе всего
TradePrice
к этой строке TradePrice[i]
: получить index
в исходном data.frame
и TradePrice
этой другой строки - Объединить: объединить результаты как новые столбцы в исходный
data.table
, например, как новые столбцы index.minpricewithin60
и minpricewithin60
Пример результата:
> 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
Мне кажется, мою проблему можно задать как "как исправить строку в dplyr
аналогично apply(df,1, function(x) df$column-x["column"])
У меня есть потенциальные решения с использованием dplyr
, но до сих пор все было довольно медленно.