用data.table包實現滑動窗口函數的最佳(最快)方法是什麼?R data.table滑動窗口
我想計算滾動中位數,但每個日期有多行(由於2個附加因素),我認爲這意味着動物園rollapply函數將無法正常工作。以下是使用幼稚循環的示例:
library(data.table)
df <- data.frame(
id=30000,
date=rep(as.IDate(as.IDate("2012-01-01")+0:29, origin="1970-01-01"), each=1000),
factor1=rep(1:5, each=200),
factor2=1:5,
value=rnorm(30, 100, 10)
)
dt = data.table(df)
setkeyv(dt, c("date", "factor1", "factor2"))
get_window <- function(date, factor1, factor2) {
criteria <- data.table(
date=as.IDate((date - 7):(date - 1), origin="1970-01-01"),
factor1=as.integer(factor1),
factor2=as.integer(factor2)
)
return(dt[criteria][, value])
}
output <- data.table(unique(dt[, list(date, factor1, factor2)]))[, window_median:=as.numeric(NA)]
for(i in nrow(output):1) {
print(i)
output[i, window_median:=median(get_window(date, factor1, factor2))]
}
+1,好問題。 – Ryogi 2012-07-26 21:28:53
+1。你能提供更多關於數據大小和時間的信息嗎?從你的評論到Alan的回答(艾倫和艾倫是不同的人?),它需要6.4s(對於'data.frame',973s),你想進一步提高6.4s? – 2012-08-08 14:30:41
艾倫和阿蘭是不同的人:)。該數據集有約650,000行。我想出了一個速度更快,但內存密集的解決方案。關於如何進一步改進的任何想法? – alan 2012-08-10 15:02:12