2010-12-14 9 views
5

Costruisce un oggetto xts con due righe.Impostazione di un indice xts

library(xts) 
junk<-xts(c(1,2),as.Date(c("2010-01-01","2010-05-01"))) 
junk 
>   [,1] 
> 2010-01-01 1 
> 2010-05-01 2 

Perché il seguente non modifica l'indice per la prima riga?

time(junk[1])<-as.Date("2010-02-01") 
junk 
>   [,1] 
> 2010-01-01 1 
> 2010-05-01 2 

Mi rendo conto che i seguenti lavori, ma perché non funziona sopra?

time(junk)[1]<-as.Date("2010-02-01") 
junk 
>   [,1] 
> 2010-02-01 1 
> 2010-05-01 2 

Grazie,
Bill

risposta

2

Le date in serie temporali non vengono riferimento con "[". Sono più simili a giochi di ruolo nei dataframes. Sono memorizzati nella foglia "indice" della lista degli attributi. In aggiunta a ciò, essi non sono di classe Date, ma piuttosto la classe DateTime in modo da necessità di possono utilizzare POSIXct:

> attributes(junk)$index[1] <- as.POSIXct("2010-02-01") 
> junk 
      [,1] 
2010-02-01 1 
2010-05-01 2 

Edit: più precisamente il $ indice di attributo è internamente in pochi secondi, ma il metodo di tempo potrà accettare una varietà di classi di incarichi.

+0

Ricorderò che funzione attributi. Sto ancora lavorando a quel metodo ("time <-") cosa. È una buona idea per me usare as.POSIXct() piuttosto che as.Date()? La maggior parte dei miei dati di tempo saranno dati giornalieri o mensili (i requisiti minimi e secondari sono rari, ma possibili). –

+0

In questo caso non è necessario, poiché c'è una funzione <- temporizzata. Ciò significa che la classe dell'oggetto che viene assegnato viene valutata per la prima volta e quando la classe Data viene moltiplicata correttamente per 24 * 60 * 60 e viene applicato un offset prima di essere inserito nella rappresentazione interna che è in secondi. –

2
time(junk[1]) <- as.Date("2010-02-01") 

che questo non cambia l'indice della prima fila di junk perché sottoinsiemi crea un nuovo oggetto - senza riferimento al junk --e time<-.xts sostituisce l'indice del nuovo oggetto.

+2

Tranne il tempo <-. Xts metodo. Non è visibile ma appare con i metodi ('time <-'). –

+0

@Dwin buona cattura. Stavo guardando 'time', non' time <-'. Questo è quello che ottengo per pubblicare subito prima di andare a letto. –

+0

Questo ha senso. Inoltre, nell'istruzione time (junk) [1] (l'ultimo pezzo di codice), viene creato un nuovo sottoinsieme che fa riferimento a junk? E, quel riferimento costringe la spazzatura ad essere modificata? –

7

La risposta diretta al post è che la magia è all'interno di attr<- come dice Josh. La suddivisione in secondo luogo dell'oggetto crea semplicemente un nuovo oggetto che viene immediatamente eliminato una volta < - è finito.

Inoltre, è possibile visualizzare gli "interni" dell'indice tramite la funzione .index(). Essenzialmente un vettore di tipo double o intero che si associa a POSIXct time - con alcuni attributi allegati. La classe che stai assegnando viene automaticamente forzata avanti e indietro. Ciò rende la manutenzione interna più semplice e ti consente di fare cose con qualsiasi classe temporale di cui hai bisogno al di fuori di essa.

In generale, Data sarà il modo più pulito per mantenere TZ e secs fuori dal mix, ma tieni presente che il costo di questo aspetto nascosto è la funzione index(). Questo dovrà ricreare l'oggetto che ti aspetti.

+0

Benvenuti in StackOverflow, Jeff! – Shane