这是一个有用的技巧,在 xts 文档中可能会更加突出。
从一个开始xts
object
R> set.seed(42) ## fix seed
R> X <- xts(cumsum(rnorm(100))+100, order.by=Sys.time()+cumsum(runif(100)))
R> head(X)
[,1]
2012-10-05 06:42:20.299761 101.371
2012-10-05 06:42:20.816872 100.806
2012-10-05 06:42:21.668803 101.169
2012-10-05 06:42:22.111599 101.802
2012-10-05 06:42:22.269479 102.207
2012-10-05 06:42:22.711804 102.100
给定这个不规则序列,我们希望按照我们规定的规则间隔进行子集化。在这里,我创建了一个两秒的间隔。任何其他的都可以如果是同一类型作为索引,这里POSIXct
.
R> ind <- seq(start(X) - as.numeric(start(X)-round(start(X))) + 1,
+ end(X), by="2 secs")
R> head(ind)
[1] "2012-10-05 06:42:21 CDT" "2012-10-05 06:42:23 CDT"
[3] "2012-10-05 06:42:25 CDT" "2012-10-05 06:42:27 CDT"
[5] "2012-10-05 06:42:29 CDT" "2012-10-05 06:42:31 CDT"
R>
现在的技巧是将规则序列与不规则序列合并,调用na.locf()
在其上将最后一个好的不规则观测值调用到新的时间网格上——然后在时间网格上进行子集化:
R> na.locf(merge(X, xts(,ind)))[ind]
X
2012-10-05 06:42:21 100.8063
2012-10-05 06:42:23 102.1004
2012-10-05 06:42:25 105.4730
2012-10-05 06:42:27 107.2635
2012-10-05 06:42:29 104.9588
2012-10-05 06:42:31 101.7505
2012-10-05 06:42:33 104.6884
2012-10-05 06:42:35 103.6441
2012-10-05 06:42:37 101.6476
2012-10-05 06:42:39 98.6246
2012-10-05 06:42:41 97.9922
2012-10-05 06:42:43 97.7545
2012-10-05 06:42:45 101.0187
2012-10-05 06:42:47 98.0331
2012-10-05 06:42:49 100.7752
2012-10-05 06:42:51 103.0702
2012-10-05 06:42:53 102.6578
2012-10-05 06:42:55 103.1342
2012-10-05 06:42:57 103.4714
2012-10-05 06:42:59 102.3683
2012-10-05 06:43:01 105.0394
2012-10-05 06:43:03 103.9775
R>
Voila.