vecteur de POSIXct et sapply
Question
Que faire si vous voulez appliquer une fonction autre que format
à une liste d'objets POSIXct? Par exemple, dire que je veux prendre un vecteur de temps, tronquer ces temps à l'heure, et d'appliquer une fonction arbitraire à chacun de ces temps.
> 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"
Maintenant, je me attends à la longueur de obs.truncated
être 3, mais
> length(obs.truncated)
[1] 9
Vous pouvez donc voir que d'essayer de apply
une fonction à ce vecteur ne va pas au travail. La classe de obs.truncated
est
> class(obs.truncated)
[1] "POSIXt" "POSIXlt"
Toute idée de ce qui se passe ici? apply
et length
semblent prendre le premier élément du vecteur comme sa propre liste.
La solution
Le length()
d'un tel POSIXlt utilisé pour être signalé comme neuf, mais qui a obtenu récemment corrigé.
En outre, quand je fais trunc(obs.times)
la chose se passe mal - trunc()
ne fonctionne qu'une fois sur une chaîne de trois éléments. vous avez besoin apply()
et al.
Voici donc un exemple d'utilisation sapply()
avec remise à zéro composante par composante:
> 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"
>
Alors
> 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
>