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.

Était-ce utile?

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
> 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top