Iterar sobre POSIXlt en R
Frecuentes
Visto 910 veces
3
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?
1 Respuestas
2
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 r or haz tu propia pregunta.
¿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 enPOSIXct
, que es probablemente la solución menos "fea". - Roland¿Por qué es feo coaccionar a POSIXct? y no entiendo su última pregunta, dado un POSIXlt... hos para recorrer qué? - agstudy
Sustituí la función compleja con
print
solo para indicar el problema. En el mundo real, algunas funcionan comodownloadDataForDate
se utiliza. - Andrey TatarinovPor 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. - Dirk Eddelbuettel
Chicos, el rendimiento coercitivo no es un problema aquí. Finjamos que discutimos sobre otra clase
XXX
, que no tieneXXXct
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? - Andrey Tatarinov