是否有更好的方法来实现以下代码:
slice.periods <- function (x, periods, ...)
{
if (!require("xts")) {
stop("Need 'xts'")
}
Reduce(rbind.xts, lapply(periods, function(t) x[t], ...))
}
其中x是xts对象,句点是可迭代的章程列表,可由xts子集识别。样品使用:
j <- xts(rnorm(10e6),Sys.time()-(10e6:1))
v <- c("T10:00/T11:00", "T13:00/T15:00", "T20:30/T22:00")
system.time(slice.periods(j, v))
## result on my MacBook Air (1.8 GHz Intel Core i7; 4 GB 1333 MHz DDR3)
## user system elapsed
## 14.956 0.876 15.837
有几个问题:
我看到一些帖子,如果时间是UTC,通过直接访问有一些惊人的加速,请参阅以下帖子: data.table time subset vs xts time subset
但是,我的应用程序需要本地时区夏令时。这使得夏季和冬季之间的UTC时间转换不同,并且上述方法不起作用。
我还考虑使用data.table,因为我在替换do.Call(rbind,...)或Reduce(rbind,...)时使用“rbindlist”有一些很棒的性能。同样,data.table有一些很酷的子集功能,我不熟悉。另一方面,rbindlist和as.data.table不会将xts对象作为输入,我不确定使用data.table作为时间序列数据子集是一个不错的选择。
如果有其他想法,我愿意尝试。非常感谢许多人。
答案 0 :(得分:4)
如果瓶颈为rbind.xts
,此解决方案会更快,但瓶颈是时间子集。
jv <- j[unlist(lapply(v, function(i) j[i, which.i=TRUE])),]
非UTC时区的时间子集速度很慢,因为xts目前会将POSIXct
索引转换为POSIXlt
以获取一年中的某一天。