R data.table滑动窗口

ala*_*lan 48 r time-series sliding-window data.table

使用data.table包实现滑动窗口函数的最佳(最快)方法是什么?

我正在尝试计算滚动中位数但每个日期有多行(由于2个额外的因素),我认为这意味着动物园rollapply函数不起作用.以下是使用naive 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))]
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*wle 9

data.table目前,滚动窗口没有任何特殊功能.我在这里回答另一个类似问题的进一步细节:

有没有一种快速的方法在data.table中运行滚动回归?

滚动中位数很有意思.它需要一个专门的功能才能有效地完成(与早期评论中的链接相同):

C中的滚动中值算法

data.table这里的问题和答案中的解决方案相对于适当的专门rollingmedian功能(R afaik不可用)都是非常低效的.

  • 我们能否提升FR#2185的优先级?"添加滑动窗口的功能/文档".从我的角度来看,它不需要任何滚动总和,平均值等.最好有一种框架函数"rollfun ="或下面的方法:我已经尝试过自动连接roll = 30,mult = 'all',allow.cartesian实现它,但没有成功."n"也可以接受矢量,而不仅仅是标量. (7认同)
  • @MusX好的,我把优先级提高到了最高点. (6认同)