我想知道在R中创建ts时如何利用已经存在的日期字段。
有时,您只是在拥有ts对象之前先有一个日期,例如
x <- as.Date("2008-01-01") + c(30,60,90,120,150)
# add some data to it
df = data.frame(datefield=x,test=1:length(x))
现在,有没有办法在创建ts对象时将df的日期字段用作索引?因为:
ts(df$test,start=c(2008,1,2),frequency=12)
(显然)完全忽略了我已有的日期信息。使用诸如acf之类的ts方法是为什么要使其成为ts对象的原因。我通常每月使用一个季度时间序列。
最佳答案
您不一定需要从头开始创建新类型的对象。您可以随时强制使用其他类,包括所需的ts
。 zoo
或xts
可以说是最有用和最直观的,但是还有其他一些。这是您的示例,被转换为动物园对象,然后我们将其强制转换为类ts
以便在acf()
中使用。
## create the data
x <- as.Date("2008-01-01") + c(30,60,90,120,150)
df = data.frame(datefield=x,test=1:length(x))
## load zoo
require(zoo)
## convert to a zoo object, with order given by the `datefield`
df.zoo <- with(df, zoo(test, order.by = x))
## or to a regular zoo object
df.zoo2 <- with(df, zooreg(test, order.by = x))
现在我们可以使用
ts
方法轻松地转到as.ts()
对象:> as.ts(df.zoo)
Time Series:
Start = 13920
End = 14040
Frequency = 0.0333333333333333
[1] 1 2 3 4 5
> ## zooreg object:
> as.ts(df.zoo2)
Time Series:
Start = 13909
End = 14029
Frequency = 1
[1] 1 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[21] NA NA NA NA NA NA NA NA NA NA 2 NA NA NA NA NA NA NA NA NA
[41] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[61] 3 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[81] NA NA NA NA NA NA NA NA NA NA 4 NA NA NA NA NA NA NA NA NA
[101] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[121] 5
注意对象的两种表示方式(尽管我们可以通过将
frequency
参数设置为0.03333333
来使zooreg版本与标准zoo对象相同):> as.ts(with(df, zooreg(test, order.by = datefield,
+ frequency = 0.033333333333333)))
Time Series:
Start = 13920.0000000001
End = 14040.0000000001
Frequency = 0.033333333333333
[1] 1 2 3 4 5
我们可以使用
acf()
中的zoo / zooreg对象,它将获得正确的滞后(每天观察一次,但每30天一次):acf(df.zoo)
这对您而言是否直观取决于您如何查看时间序列。我们可以通过30天的间隔执行相同的操作:
acf(coredata(df.zoo))
在这里,我们使用
coredata()
提取时间序列本身,而忽略日期信息。
关于r - 在ts中使用日期字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5182262/