Subset vektor seri waktu R

25

Saya memiliki deret waktu dan saya ingin mengelompokkannya sambil menyimpannya sebagai deret waktu, menjaga awal, akhir, dan frekuensi.

Misalnya, katakan saya memiliki deret waktu:

> 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     

Sekarang saya akan mengelompokkannya:

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

Perhatikan bahwa saya mendapatkan hasil yang benar, tetapi saya kehilangan "pembungkus" dari deret waktu (yaitu mulai, akhir, frekuensi.)

Saya mencari fungsi untuk ini. Bukankah berlangganan rangkaian waktu adalah skenario umum? Karena saya belum menemukannya, berikut adalah fungsi yang saya tulis:

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

Saya ingin mendengar tentang peningkatan atau cara yang lebih bersih untuk melakukan ini. Secara khusus, saya tidak suka cara saya memulai dan mengakhiri hard-coding. Saya lebih suka membiarkan pengguna menentukan kondisi boolean yang sewenang-wenang.

David J.
sumber

Jawaban:

34

Gunakan windowfungsinya:

> window(qs, 2010, c(2010, 4))
     Qtr1 Qtr2 Qtr3 Qtr4
2010  104  105  106  107
Shane
sumber
2
Perhatikan juga bahwa jendela (qs, 2010, c (2010, 4)) <- 3 akan mengubah qs sesuai.
mpiktas
6

Juga berguna, jika Anda menggabungkan beberapa seri waktu dan tidak ingin harus windowsetiap orang untuk membuatnya cocok, ts.uniondan ts.intersect.

hgcrpd
sumber