Frage
Was passiert, wenn Sie eine andere Funktion als format
auf eine Liste von POSIXct Objekte anwenden möchten? Zum Beispiel, sagen, dass ich einen Vektor von Zeiten nehmen will, diese Zeiten auf die Stunde gestutzt und anzuwenden, um eine beliebige Funktion zu jedem dieser Zeiten.
> 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"
Nun würde ich die Länge von obs.truncated
erwartet 3 zu sein, aber
> length(obs.truncated)
[1] 9
So können Sie sehen, dass eine Funktion dieses Vektors apply
versuchen, ist nicht zur Arbeit gehen. Die Klasse von obs.truncated
ist
> class(obs.truncated)
[1] "POSIXt" "POSIXlt"
Jede Idee, was ist hier los? apply
und length
erscheinen das erste Element des Vektors als seine eigene Liste zu nehmen.
Lösung
Die length()
eines solchen POSIXlt verwendet als neun gemeldet werden, aber das kürzlich korrigiert wurde.
Auch wenn ich trunc(obs.times)
tun das Falsche geschieht - trunc()
arbeitet nur einmal an einer Schnur aus drei Elementen. Sie müssen apply()
et al.
So, hier ist ein Beispiel für die Verwendung sapply()
mit komponentenweise Rückstellung:
> 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"
>
Die
> 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
>