【发布时间】:2019-10-30 14:20:32
【问题描述】:
我有一个包含三个感兴趣的数字列的数据集。考虑三列之一,对于每一行,我希望对邻域观察值求和,我通过一个窗口定义。所以我对所有观察结果(每列)都这样做。
到目前为止我管理的是这个功能:
slideSum <- function(data, column, window){
total <- nrow(data)
for(window_i in seq(window[1],window[2],window[3])){
left = pmax(1,c(1:total)-window_i)
right = pmin(total,c(1:total)+window_i)
for(i in 1:total){
set(data, i, j = paste0(column,window_i),
value = data[left[i]:right[i],sum(get(column))])
}
}
}
参数是数据,我想要三列中的哪一列,以及三个条目的向量(最小窗口长度、最大窗口长度和窗口步长),例如window=c(10,20,1) 将使用长度为 10、11、12、...、20 的窗口。
我认为我的代码比较快,但有没有办法让它更快? 另外,我的函数分别处理每一列,有没有办法以相同的速度对感兴趣的三列执行相同的操作?
数据:
data <- data.table(money=runif(1000, min=0, max=.1),
debt=runif(1000, min=.05, max=.1),
misc = runif(1000, min=.05, max=1))
给我以下运行时间:
> system.time(slideSum(data, "money", c(10, 20, 2)))
user system elapsed
16.23 9.73 23.89
【问题讨论】:
-
您可以使用 .SD 结合
data.table中的 .SDcols 参数将相同的函数应用于三列。 -
代码有语法错误,函数没有返回任何东西。请解决这些问题并用文字解释它应该做什么。
-
您可以查看
?frollsum(..., adaptive=TRUE)。这个论点正好适用于不同的窗口大小。虽然我不确定如何处理 step 那里。 -
@JDG:我可以用设置的语法吗?
-
@G.Grothendieck:抱歉,我现在修复了,发布问题时遇到了一些问题,不知道出了什么问题。谢谢你告诉我!
标签: r data.table rolling-computation