On Thu, 10 Jan 2008, tom soyer wrote:
> Hi,
>
> I have two questions about ts.
>
> (1) How do I subset a ts object and still preserve the time index? for
> example:
>
> > x=ts(1:10, frequency = 4, start = c(1959, 2)) # the ts object
> > x
> Qtr1 Qtr2 Qtr3 Qtr4
> 1959 1 2 3
> 1960 4 5 6 7
> 1961 8 9 10
> I don't want the 1st 2 elements, so I could subset like this:
> > x[3:length(x)]
> [1] 3 4 5 6 7 8 9 10
>
> But then the time index is lost. I could use window(), but then I have to
> specify start and end manually. Is there a way to subset a ts object so
that
> the time index is preserved for the data extracted without specifying start
> and end data by hand?
I think window() is the way to go with "ts".
"zoo"/"zooreg" additionally provide what you ask for:
library("zoo")
x <- ts(1:10, frequency = 4, start = c(1959, 2))
z <- as.zoo(x)
z[3:length(z)]
The time formatting is somewhat nice when you declare explicitely that
this is "yearqtr" data:
time(z) <- as.yearqtr(time(z))
z[3:length(z)]
> (2) How do I join two ts objects together end to end? for example:
> > x=ts(1:10, frequency = 4, start = c(1959, 2)) # the 1st ts object
> > y=ts(11:15, frequency = 4, start = c(1961, 4)) # the 2nd ts object
>
> As you can see, y is just a continuation of x. I would like to add y to the
> end of x while preserving the time index. I could use this:
> > ts(c(x,y),start=start(x),frequency=4)
>
> But I am wondering if there is a more efficient way of doing this, i.e., is
> it really necessary to specify start and frequency again when they are
> already a part of the original ts objects?
"zoo" also provides this:
x <- ts(1:10, frequency = 4, start = c(1959, 2))
y <- ts(11:15, frequency = 4, start = c(1961, 4))
c(as.zoo(x), as.zoo(y))
or you can also coerce back to "ts"
as.ts(c(as.zoo(x), as.zoo(y)))
Personally, I tend to do my data manipulations in "zoo" (not very
surprisingly ;-)) but might coerce the resulting series to "ts" if I
want
to use certain modeling functions.
Z