【发布时间】:2014-03-11 05:41:28
【问题描述】:
以下代码是否有更好的实现方式:
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
有几个问题:
- 如果每个时间子集都非常大,“减少”可能太慢了
- 每个时间片都不是最优的,因为它不直接使用来自 xts 对象的索引。如果对象很大,可能会耗费大量时间。
我看到一些帖子,如果时间是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 用于时序数据子集是否是一个不错的选择。
如果有其他想法,我愿意尝试。提前感谢很多。
【问题讨论】:
-
对于 1.,请参阅stackoverflow.com/a/12029366/967840
标签: r performance data.table xts subset