Pregunta

¿Qué pasa si desea aplicar una función distinta de format a una lista de objetos POSIXct? Por ejemplo, digamos que quiero tomar un vector de veces, truncar esos tiempos a la hora, y aplicar una función arbitraria a cada una de esas veces.

> 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"

Ahora, yo esperaría que la longitud de obs.truncated ser 3, pero

> length(obs.truncated)
[1] 9

Así se puede ver que tratar de apply una función a este vector no va a funcionar. La clase de obs.truncated es

> class(obs.truncated)
[1] "POSIXt"  "POSIXlt"

Cualquier idea de lo que está pasando aquí? apply y length parecen estar tomando el primer elemento del vector como su propia lista.

¿Fue útil?

Solución

El length() de un POSIXlt como solía ser reportado como nueve, pero que recientemente obtuvo corregido.

Además, cuando hago las cosas mal trunc(obs.times) sucede - trunc() funciona solamente una vez en una serie de tres elementos. Sí es necesario apply() et al.

Así que aquí es un ejemplo del uso sapply() con rearme componente a componente:

> 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"
> 

Mientras

> 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
> 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top