Вопрос

Что если вы хотите применить функцию, отличную от 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
> 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top