有沒有更好的方式來實現以下代碼:從xts改進多時間範圍子集的性能?
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,因爲我在使用「rbindlist」替換do.Call(rbind,...)或Reduce(rbind,...)方面有很好的性能。 data.table也有一些很酷的子集特性,這些我都不熟悉。另一方面,rbindlist和as.data.table將不會將xts對象作爲輸入,並且我不確定對時間序列數據子集使用data.table是個不錯的選擇。
如果還有其他想法,我很樂意嘗試。多謝提前。
對於1.,請參閱http://stackoverflow.com/a/12029366/967840 – GSee