2012-06-12 13 views
9

Sono molto nuovo a R quindi mi scuso se ottengo una qualsiasi terminologia errata quando spiego questo problema.Pull Ritorno dal primo giorno lavorativo del mese dall'oggetto XTS utilizzando R

Ho un set di dati di ritorni giornalieri in un file csv che sono riuscito a convertire in un oggetto xts. I dati sono nel formato:

  HighYield..EUR. MSCI.World..EUR. 
2002-01-31   0.0144   0.0031  
2002-02-01   0.0056   -0.0132  
2002-02-02   0.0373   0.0356  
2002-02-03   -0.0167   -0.0644  
2002-02-04   -0.0062   -0.0332  
2002-02-05   -0.0874   -0.1112 
... 

Voglio creare uno script che troverà il primo giorno lavorativo del mese (dalla gamma di valori nell'indice) e quindi creare un nuovo XTS oggetto con questi rendimenti dentro.

Ad esempio, dopo che lo script è eseguito vorrei avere un oggetto XTS nel formato:

  HighYield..EUR. MSCI.World..EUR. 
2002-01-31   0.0144   0.0031  
2002-02-28   0.0011   -0.0112  
2002-03-31   0.0222   0.0224  
2002-04-30   -0.0333   -0.0223  
2002-05-30   -0.0011   -0.0012  
2002-06-30   -0.0888   -0.0967 
... 

Qualcuno mi può aiutare per favore? e se possibile, spiega cosa sta facendo ogni parte dello script.

+0

Il vostro esempio mostra ultimo giorno di ogni mese, ma non importa. Ci sono molti modi per tirare date specifiche, fino a tali kludges come (pseudocodice) 'if (mese (dateval [i]> month (dateval [i-1]) quindi {copia questa i-th row in output}'. Dai un'occhiata al pacchetto 'lubridate' per le funzioni utili relative alla data –

risposta

11

Grazie alla potenza del linguaggio di base R, è possibile farlo in una sola riga:

library(xts) 
data(sample_matrix) 
x <- as.xts(sample_matrix) 
do.call(rbind, lapply(split(x, "months"), first)) 

di spiegare che cosa ogni passo sta facendo:

# Split the xts object into a list with an element for each month. 
x1 <- split(x, "months") 
# Loop over the list (x1) and call the first() function on each element. 
# This returns a new list where each element only contains the first observation 
# from each respective element in x1. 
x2 <- lapply(x1, first) 
# Call rbind() with all the elements of x2 as arguments to rbind() 
# Same as rbind(x2[[1]], x2[[2]], ..., x2[[N]]) 
x3 <- do.call(rbind, x2) 
+0

Joshua, sei uno studioso e un gentiluomo Sono indebitato – GreenyMcDuff

+0

Se assumiamo che il" primo giorno lavorativo "sia letteralmente esclusivo di Sabato e domenica, non dovremmo usare 'do.call (rbind, lapply (split (x [.indexwday (x)% in% 1: 5]," mesi "), prima))'? O c'è un anche modo migliore con "xts" per fare questo? – A5C1D2H2I1M1N2O1R2T1

+0

@mrdwab: sì, questo è un buon punto.La mia risposta presuppone che l'oggetto contenga solo giorni lavorativi.Il tuo è migliore, ma non esclude alcuna potenziale festività. [timeDate] (http://cran.r-project.org/web/packages/timeDate/index.html) Il pacchetto ha delle buone funzioni per questo: –

Problemi correlati