Sous-ensemble des vecteurs de séries temporelles R

25

J'ai une série chronologique et je souhaite la sous-définir tout en la conservant sous forme de série chronologique, en préservant le début, la fin et la fréquence.

Par exemple, disons que j'ai une série chronologique:

> qs <- ts(101:110, start=c(2009, 2), frequency=4)
> qs
     Qtr1 Qtr2 Qtr3 Qtr4
2009       101  102  103
2010  104  105  106  107
2011  108  109  110     

Maintenant, je vais le sous-ensemble:

> qs[time(qs) >= 2010 & time(qs) < 2011]
[1] 104 105 106 107

Notez que j'ai obtenu les bons résultats, mais j'ai perdu les "enveloppements" de la série chronologique (à savoir début, fin, fréquence.)

Je cherche une fonction pour ça. Le sous-ensemble d'une série temporelle n'est-il pas un scénario courant? Comme je n'en ai pas encore trouvé, voici une fonction que j'ai écrite:

subset.ts <- function(data, start, end) {
  ks <- which(time(data) >= start & time(data) < end)
  vec <- data[ks]
  ts(vec, start=start(data) + c(0, ks[1] - 1), frequency=frequency(data))
}

J'aimerais entendre des améliorations ou des façons plus propres de procéder. En particulier, je n'aime pas la façon dont je code en dur le début et la fin. Je préfère laisser l'utilisateur spécifier une condition booléenne arbitraire.

David J.
la source

Réponses:

34

Utilisez la windowfonction:

> window(qs, 2010, c(2010, 4))
     Qtr1 Qtr2 Qtr3 Qtr4
2010  104  105  106  107
Shane
la source
2
Notez également que la fenêtre (qs, 2010, c (2010, 4)) <- 3 modifiera les qs en conséquence.
mpiktas
6

Également utile, si vous combinez plusieurs séries chronologiques et que vous ne voulez pas avoir à les avoir windowtoutes pour les faire correspondre, ts.unionet ts.intersect.

hgcrpd
la source