Вопрос
Что если вы хотите применить функцию, отличную от format
в список объектов Posixct? Например, скажем, я хочу взять вектор, усечь те времена в час и применить произвольную функцию к каждому из тех случаев.
> obs.times=as.POSIXct(c('2010-01-02 12:37:45','2010-01-02 08:45:45','2010-01-09 14:45:53'))
> obs.truncated=trunc(obs.times, units="hours")
> obs.truncated
[1] "2010-01-02 12:00:00 EST" "2010-01-02 08:00:00 EST"
[3] "2010-01-09 14:00:00 EST"
Теперь я ожидаю продолжительности obs.truncated
быть 3, но
> length(obs.truncated)
[1] 9
Так что вы можете увидеть, что пытается apply
Функция этого вектора не будет работать. Класс obs.truncated
является
> class(obs.truncated)
[1] "POSIXt" "POSIXlt"
Есть идеи, что здесь происходит? apply
и length
кажется, принимает первый элемент вектора в качестве своего собственного списка.
Решение
А length()
О таком posixlt сообщалось как девять, но это недавно исправлено.
Кроме того, когда я это сделаю trunc(obs.times)
Неверная вещь происходит - trunc()
Работает только один раз на строке из трех элементов. Тебе нужно apply()
и другие.
Итак, вот пример использования sapply()
С компонентом сброса:
> sapply(obs.times, function(.) {
+ p <- as.POSIXlt(.);
+ p$min <- p$sec <- 0;
+ format(p) })
[1] "2010-01-02 12:00:00" "2010-01-02 08:00:00" "2010-01-09 14:00:00"
>
Тогда как
> trunc(obs.times, units="hours")
[1] "2010-01-02 12:00:00 CST" "2010-01-02 08:00:00 CST"
[3] "2010-01-09 14:00:00 CST"
> class(trunc(obs.times, units="hours"))
[1] "POSIXt" "POSIXlt"
> length(trunc(obs.times, units="hours"))
[1] 1
>