【发布时间】:2012-07-25 11:07:15
【问题描述】:
使用 data.table 包实现滑动窗口功能的最佳(最快)方法是什么?
我正在尝试计算滚动中位数,但每个日期有多个行(由于 2 个附加因素),我认为这意味着 zoo rollapply 函数不起作用。这是一个使用简单 for 循环的示例:
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。您能否提供有关数据大小和时间的更多信息。从您对艾伦回答的评论(艾伦和艾伦是不同的人?),它需要 6.4 秒(
data.frame需要 973 秒),您想进一步提高 6.4 秒吗? -
艾伦和艾伦是不同的人:)。该数据集有约 650,000 行。我想出了一个工作速度更快但内存非常密集的解决方案。关于如何进一步改进它的任何想法?
标签: r time-series data.table sliding-window