Учитывая вектор значений даты и времени, мне нужно было создать data.frame
, содержащее дату и время в 0:10
часах после каждой исходной даты / времени - первый столбец через 0 часов, второй столбец через 1 час и т. Д.
У меня возникли проблемы с поиском способа сделать это легко с помощью lubridate
. Я думал, что это должно работать:
rt <- ymd_hms(c("2011-11-03 19:24:12", "2011-10-28 20:48:21",
"2011-11-04 10:06:14", "2011-10-31 17:10:05", "2011-10-28 06:35:59"))
result <- outer(rt, hours(0:10), "+")
Но различные части этого трубопровода выходят из строя. В конечном итоге я получаю эту ошибку:
Error in FUN(X[[1L]], ...) : invalid 'times' argument
, который, кажется, происходит из-за неспособности rep.POSIXct()
или rep.period()
обрабатывать аргумент не 101-длины times
. Или что-то.
И это, вероятно, в любом случае не сработало бы, потому что outer()
возвращает матрицу, и объекты даты, даже даты POSIXct (которые внутренне являются просто целыми числами), кажется, не могут быть элементами в матрице.
То, что я выяснил, что это сработало (просто чтобы получить время, а не помещать их в кадр данных), после примерно 10 других догадок, было так:
with_tz(do.call(c, lapply(rt, function(x) x+hours(0:3))), tz(rt[1]))
Необходимо добавить with_tz()
, поскольку c()
теряет атрибут часового пояса. Я также должен сделать do.call(c, lapply(...))
, а не просто sapply(...)
, потому что sapply()
теряет тот факт, что это дата.
Возможно, другой альтернативой было бы создание фрейма данных с помощью do.call(cbind, ...)
или чего-то еще.
В общем, было бы замечательно, если бы каждый раз, когда мы находим R задачи даты / времени, которые кажутся концептуально простыми, но требуют большой гимнастики, прежде чем найти решение, мы могли бы устранить препятствия, внеся изменения в lubridate
или что-то еще , Я думаю, что это может быть одним из тех времен. =)