Domanda

Che cosa succede se si desidera applicare una funzione diversa format ad un elenco di oggetti POSIXct? Per esempio, dire che voglio prendere un vettore di volte, troncare quei tempi per l'ora, e applicare una funzione arbitraria a ciascuno di quei tempi.

> 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"

Ora, io mi aspetterei che la lunghezza del obs.truncated essere 3 ma

> length(obs.truncated)
[1] 9

Così si può vedere che il tentativo di apply una funzione per questo vettore non è andare a lavorare. La classe dei obs.truncated è

> class(obs.truncated)
[1] "POSIXt"  "POSIXlt"

Qualche idea di cosa sta succedendo qui? apply e length sembrano prendere il primo elemento del vettore come un proprio elenco.

È stato utile?

Soluzione

Il length() di tale POSIXlt usato per essere segnalato come nove, ma che ha ottenuto di recente corretto.

Inoltre, quando faccio la cosa sbagliata trunc(obs.times) accade - trunc() funziona solo una volta su una serie di tre elementi. Si ha bisogno apply() et al.

Così qui è un esempio di utilizzo sapply() con il componente-saggio ripristino:

> 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"
> 

considerando che

> 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
> 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top