Subconjunto de vectores de series de tiempo R

25

Tengo una serie de tiempo y quiero subgrupo mientras la mantengo como una serie de tiempo, preservando el inicio, el final y la frecuencia.

Por ejemplo, digamos que tengo una serie de tiempo:

> 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     

Ahora lo subconjunto:

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

Tenga en cuenta que obtuve los resultados correctos, pero perdí los "envoltorios" de la serie de tiempo (es decir, inicio, final, frecuencia).

Estoy buscando una función para esto. ¿No es un subconjunto de series de tiempo un escenario común? Como todavía no he encontrado uno, aquí hay una función que escribí:

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

Me gustaría escuchar sobre mejoras o formas más limpias de hacer esto. En particular, no me gusta la forma en que codifico el inicio y el final. Prefiero dejar que el usuario especifique una condición booleana arbitraria.

David J.
fuente

Respuestas:

34

Usa la windowfunción:

> window(qs, 2010, c(2010, 4))
     Qtr1 Qtr2 Qtr3 Qtr4
2010  104  105  106  107
Shane
fuente
2
También tenga en cuenta que window (qs, 2010, c (2010, 4)) <- 3 cambiará las qs en consecuencia.
mpiktas
6

También es útil, si está combinando varias series de tiempo y no quiere tener que tener windowcada una para que coincidan, ts.uniony ts.intersect.

hgcrpd
fuente