2017-04-19 1 views
1

J'ai un grand xts que je veux filtrer par mois et par date pour chaque année présente.Plus rapide façon de sous-ensemble xts

library(xts) 
junk <- xts(sample.int(101, size = 1461, replace = T), seq(as.Date('2006-01-01'), as.Date('2009-12-31'), 'days')) 
junk_sma10 = TTR::SMA(x = junk, n = 10) ## trailing 10 day avg 

En ce moment, je le ferais via une boucle pour chaque jour et mois qui prend un certain temps. Je sais que R est mieux à faire des choses à la fois.

months_filtered <- idx_apcp30[.indexmon(junk_sma10) == 1]  ## filter for feb 
final_filtered <- months_filtered[.indexmday(months_filtered) == 15] ## filter for 16th 

La sortie est un xts unique pour chaque jour de l'année.

  SMA 
2006-02-16 61.0 
2007-02-16 50.5 
2008-02-16 60.5 
2009-02-16 54.1 

puis la prochaine itération (+1 mday) produirait

  SMA 
2006-02-17 64.3 
2007-02-17 48.4 
2008-02-17 66.1 
2009-02-17 48.6 

je dois produire et stocker tous les XTS que ce processus produit. Comment est-ce que je fais ceci en boucle?

J'ai trouvé une solution comme ceci:

junk[seq(as.Date('2006-01-01'),as.Date('2009-12-31'),by='year')] 

Mais je dois encore parcourir tous les jours ...

Répondre

1

Une solution facile est de split votre XTS objet en morceaux par mois et le jour .

# if using xts < 0.10-0 (bug work-around) 
month_day <- split(junk_sma10, as.numeric(format(index(junk_sma10), "%m%d"))) 

# requires xts >= 0.10-0 
month_day <- split(junk_sma10, format(index(junk_sma10), "%m%d")) 

Maintenant month_day est une liste, où chaque élément est le même mois et le jour du mois pour chaque année. Ensuite, vous pouvez continuer votre analyse en utilisant lapply pour appeler une fonction sur chaque élément de la liste.