2011-10-24 22 views
6

Cara Comunità,zoo aggregazione oggetto

i dati che ricevo sarà in un frame di dati:

Var_1  Var_2   Date  VaR_3 VaR_4 VaR_5 Var_6 
1   4  2010-01-18   7 apple 10 sweet 
2   5  2010-07-19   8 orange 11 sour 
3   6  2010-01-18   9 kiwi  12 juicy 
...  ...  ...    ... ...  ... ... 

Vorrei utilizzare zoo, dal momento che sembra essere una classe di oggetti flessibili. Sto solo iniziando con R e ho provato a leggere la descrizione (vignette) del pacchetto.

Domande:

  1. sulla base dei dati di cui sopra come un frame di dati, che è consigliato il metodo per convertire il df completa in un oggetto zoo, dicendo zoo che deve usare la terza colonna come colonna della data (le date possono si verificano più volte nei dati)?
  2. Come faccio ad aggregare tutte le altre colonne mensilmente, eccetto le colonne 4 e 6 utilizzando le funzioni built-in dello zoo? Lo zoo è in grado di scartare automaticamente le variabili categoriali e utilizzare solo le colonne adatte per l'aggregazione?
  3. Come faccio ad aggregare tutte le colonne numeriche mensilmente, per ogni categoria nella colonna 4 (la colonna 6 non deve essere inclusa, poiché non è numerica).

Grazie per il vostro supporto.

+0

sembra funzionare per la domanda 1: df.z <-read.zoo (df, index.column = 3, aggregato = F) – John

risposta

4

Gli oggetti dello zoo sono serie temporali e sono in genere vettori numerici o matrici. Sembra che quello che hai veramente sia un insieme di diverse serie temporali in cui la colonna 5 identifica le serie che sono. Cioè, c'è una serie di mele, una serie arancione, una serie di kiwi, ecc. E ognuna di esse ha diverse colonne.

Rimozione dell'ultimo colonna dalla sua non numerico, utilizzando la terza colonna come indice e frazionamento su colonna 5 si ha:

# create test data 
Lines <- "Var_1  Var_2   Date  VaR_3 VaR_4 VaR_5 Var_6 
1   4  2010-01-18   7 apple 10 sweet 
2   5  2010-07-19   8 orange 11 sour 
3   6  2010-01-18   9 kiwi  12 juicy" 
cat(Lines, "\n", file = "data.txt") 

library(zoo) 
z <- read.zoo("data.txt", header = TRUE, index = 3, split = "VaR_5", 
    colClasses = c(Var_6 = "NULL")) 

Il risultato è:

> z 
      Var_1.apple Var_2.apple VaR_3.apple VaR_5.apple Var_1.kiwi 
2010-01-18   1   4   7   10   3 
2010-07-19   NA   NA   NA   NA   NA 
      Var_2.kiwi VaR_3.kiwi VaR_5.kiwi Var_1.orange Var_2.orange 
2010-01-18   6   9   12   NA   NA 
2010-07-19   NA   NA   NA   2   5 
      VaR_3.orange VaR_5.orange 
2010-01-18   NA   NA 
2010-07-19   8   11 

Quanto sopra presuppone che per un dato valore della colonna 5, le date sono uniche. Se questo non è il caso, includere l'argomento aggregate = mean o qualche altro valore per aggregate.

Per ora aggregare in una serie mensile zoo abbiamo:

aggregate(z, as.yearmon, mean) 

Sarebbe anche possibile convertirlo subito a mensile utilizzando l'argomento FUN = as.yearmon:

zm <- read.zoo("data.txt", header = TRUE, index = "Date", split = "VaR_4", 
    FUN = as.yearmon, colClasses = c(Var_6 = "NULL"), aggregate = mean) 

Vedi ?read.zoo , vignette("zoo-read"), ?aggregate.zoo e le altre vignette e file di aiuto.

+0

Caro Gabor, grazie per la risposta e le suggestioni riflessivo. In realtà il mio set di dati è più complesso. Per l'esempio ho ridotto il data frame in modo tale che mostri le proprietà più importanti. Quale colonna per la divisione verrà utilizzata non è nota. Ci sono molte altre colonne contenenti numeri o categorie. Usando il tuo metodo, devo ordinarli manualmente quando voglio eseguire un'aggregazione attraverso l'oggetto zoo.C'è un modo per utilizzare un test logico su ciascuna colonna in modo tale che riassuma e conservi solo le colonne dell'oggetto zoo, che contengono dati numerici? – John

+0

Per chiarire ulteriormente: nel primo passaggio vorrei aggregare come descritto su tutti i dati. Il secondo passo sarà dividere per categorie. Esiste la possibilità che per ogni categoria avvengano voci alla stessa data. Questo dovrebbe essere ok, dato che mi piacerebbe determinare nella maggior parte dei casi solo la somma, la media e il numero assoluto di conteggi per ogni mese. – John

+0

Penso che si assuma che l'oggetto abbia colonne numeriche e non numeriche. gli oggetti dello zoo sono basati su vettori o matrici e non possono contenere miscele di classi diverse. Dovrebbero essere tutti numerici in questo caso. Non è chiaro cosa intendi per quale colonna dividere è sconosciuta. Alla fine dovrai sapere di cosa si tratta. Puoi leggere i dati in un data.frame e usare read.zoo sul frame di dati (il primo argomento di read.zoo può essere un frame di dati). Questo può essere fatto più volte con divisioni diverse per ottenere diversi oggetti dello zoo se lo si desidera. –

Problemi correlati