У меня есть xts
объект, который выглядит следующим образом:
> q.xts
val
2011-08-31 09:30:00.002357 -1.0135222
2011-08-31 09:30:00.003443 -0.2182679
2011-08-31 09:30:00.005075 -0.5317191
2011-08-31 09:30:00.009515 -1.0639535
2011-08-31 09:30:00.011569 -1.2470759
2011-08-31 09:30:00.012144 0.7678103
2011-08-31 09:30:00.023813 -0.6303432
2011-08-31 09:30:00.024107 -0.5105943
Я вычисляю фиксированное смещение из отметок времени в другом кадре данных, r
.Количество строк в r
значительно меньше количества строк в q.xts
.
> r
time predict.time
1 2011-08-31 09:30:00.003443 2011-08-31 09:30:00.002443
2 2011-08-31 09:30:00.009515 2011-08-31 09:30:00.008515
3 2011-08-31 09:30:00.024107 2011-08-31 09:30:00.023108
Столбец time
соответствует наблюдению от q.xts
, тогда как столбец predict.time
На 1 миллисекунду раньше, чем time
(за вычетом округления)*.Для трех наблюдений в r
выше я бы ожидал следующих совпадений:
time predict.time (time from q.xts)
1 2011-08-31 09:30:00.003443 2011-08-31 09:30:00.002443 --> 09:30:00.002357
2 2011-08-31 09:30:00.009515 2011-08-31 09:30:00.008515 --> 09:30:00.005075
3 2011-08-31 09:30:00.024107 2011-08-31 09:30:00.023108 --> 09:30:00.012144
Я подошел к этому, перебрав каждую строку в r
и выполнив xts subset
.Итак, для строки 1 из r
я бы сделал:
> last(index(q.xts[paste('/', r[1,]$predict.time, sep='')]))
[1] "2011-08-31 09:30:00.002357 CDT"
ВОПРОС: Делать это с помощью цикла кажется неуклюжим и неловким.Есть ли способ лучше?Я хотел бы закончить с другим столбцом в r
, который предоставляет точное время или номер строки для соответствующего значения в q.xts
.
ПРИМЕЧАНИЕ: Используйте это длясоздайте данные, которые я использовал для этого примера:
q <- read.csv(tc <- textConnection("
2011-08-31 09:30:00.002358, -1.01352216
2011-08-31 09:30:00.003443, -0.21826793
2011-08-31 09:30:00.005076, -0.53171913
2011-08-31 09:30:00.009515, -1.06395353
2011-08-31 09:30:00.011570, -1.24707591
2011-08-31 09:30:00.012144, 0.76781028
2011-08-31 09:30:00.023814, -0.63034317
2011-08-31 09:30:00.024108, -0.51059425"),
header=FALSE); close(tc)
colnames(q) <- c('datetime', 'val')
q.xts <- xts(q[-1], as.POSIXct(q$datetime))
r <- read.csv(tc <- textConnection("
2011-08-31 09:30:00.003443
2011-08-31 09:30:00.009515
2011-08-31 09:30:00.024108"),
header=FALSE); close(tc)
colnames(r) <- c('time')
r$time <- as.POSIXct(strptime(r$time, '%Y-%m-%d %H:%M:%OS'))
r$predict.time <- r$time - 0.001