Iterar sobre POSIXlt en R

Imagina que tengo un vector de entrada de POSIXct objetos:

times.input <- c(
  as.POSIXct('2013-01-01 00:00:00', tz='GMT'),
  as.POSIXct('2013-01-01 00:00:01', tz='GMT')
)
class(times.input)
# [1] "POSIXct" "POSIXt" 

Algunas de las funciones (como round or trunc) transformar POSIXct a POSIXlt:

unique.dates <- unique(trunc(times.input, 'days')))
class(times.rounded)
# [1] "POSIXlt" "POSIXt"

Entonces, si tratamos de iterar o lapply este objeto, suceden cosas extrañas:

lapply(X=unique.dates, FUN=print)
# [1] 0 0
# [1] 0 0
# [1] 4 4
# [1] 1 1
# [1] 0 0
# [1] 113 113
# [1] 2 2
# [1] 0 0
# [1] 0 0

Parece que POSIXlt se almacena internamente verticalmente como una lista de vectores, y la iteración se realiza sobre la estructura interna en lugar de iterar sobre cada objeto.

Sé que convertir a POSIXct ayuda en este caso, porque POSIXct se almacena como un número entero internamente, pero considero que esta solución es fea.

Así que mi pregunta es: dada una POSIXlt[2] entrada de datos, cómo realizar for loop o lapply encima POSIXct ¿objetos?

preguntado el 21 de septiembre de 13 a las 12:09

¿Puedes aclarar qué es lo que realmente quieres hacer? print(times.rounded) funciona bien para tu ejemplo. De lo contrario, el consejo genérico se convierte en POSIXct, que es probablemente la solución menos "fea". -

¿Por qué es feo coaccionar a POSIXct? y no entiendo su última pregunta, dado un POSIXlt... hos para recorrer qué? -

Sustituí la función compleja con print solo para indicar el problema. En el mundo real, algunas funcionan como downloadDataForDate se utiliza. -

Por favor, medir antes de hacer tales conjeturas. POSIXct es una forma de almacenamiento más compacta de la misma información y lo más probable es que todo el tiempo computacional relevante se transmita análisis de representación de cadena. -

Chicos, el rendimiento coercitivo no es un problema aquí. Finjamos que discutimos sobre otra clase XXX, que no tiene XXXct contrapartida. Esta clase se implementa como lista, y queremos usar iteración y/o *apply-funciones familiares a un conjunto de objetos de esta clase. ¿Cuáles serían nuestros pasos? -

1 Respuestas

esta pasando porque lapply funciona en la lista y tiene razón sobre el almacenamiento, después help("DateTimeClasses"):

La clase "POSIXlt" es una lista nombrada de vectores (...)

Si realmente necesita trabajar con POSIXlt Propongo convertir a la lista, por ejemplo:

times.input.L <- split(times.input, seq_along(times.input))
lapply(times.input.L, print)
[1] "2013-01-01 01:00:00 CET"
[1] "2013-01-01 01:00:01 CET"

Respondido el 23 de Septiembre de 13 a las 20:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.