Podzbiór wektorów szeregów czasowych R.


25

Mam szereg czasowy i chcę go rozdzielić, zachowując go jako szereg czasowy, zachowując początek, koniec i częstotliwość.

Załóżmy na przykład, że mam szereg czasowy:

> 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     

Teraz podzielę to:

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

Zauważ, że uzyskałem prawidłowe wyniki, ale straciłem „zawijanie” z szeregów czasowych (a mianowicie początek, koniec, częstotliwość).

Szukam do tego funkcji. Czy podzbiór szeregów czasowych nie jest częstym scenariuszem? Ponieważ jeszcze go nie znalazłem, oto funkcja, którą napisałem:

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))
}

Chciałbym usłyszeć o ulepszeniach lub czystszych sposobach na zrobienie tego. W szczególności nie podoba mi się sposób, w jaki twardo koduję początek i koniec. Wolę pozwolić użytkownikowi określić dowolny warunek logiczny.

Odpowiedzi:


34

Użyj windowfunkcji:

> window(qs, 2010, c(2010, 4))
     Qtr1 Qtr2 Qtr3 Qtr4
2010  104  105  106  107

2
Zauważ też, że okno (qs, 2010, c (2010, 4)) <- 3 odpowiednio zmieni qs.
mpiktas

6

Przydatne również, jeśli łączysz wiele szeregów czasowych i nie chcesz, aby windowkażdy musiał dopasować je, ts.unioni ts.intersect.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.