RcppRoll或CumSum与动态窗口滞后

RcppRoll或CumSum与动态窗口滞后,r,data.table,rcpp,R,Data.table,Rcpp,对于以下问题,必须有一个简单的、可能的递归解决方案。如果有人能帮忙,我将不胜感激: 我使用data.table和RcppRoll计算过去26周内每种产品合格周的每周销售额。窗口为26时,只要本周的#大于26,该操作就可以正常工作。然而,当本周的#小于p>时,您需要一个“自适应”窗口宽度。不确定RcppRoll是否正确,但data.table的最新版本有frollsum,它可以做到这一点 data[, pastsales := shift(frollsum(sales*countweek, pmi

对于以下问题,必须有一个简单的、可能的递归解决方案。如果有人能帮忙,我将不胜感激:

我使用data.table和RcppRoll计算过去26周内每种产品合格周的每周销售额。窗口为26时,只要本周的#大于26,该操作就可以正常工作。然而,当本周的#小于p>时,您需要一个“自适应”窗口宽度。不确定RcppRoll是否正确,但data.table的最新版本有
frollsum
,它可以做到这一点

data[, pastsales := shift(frollsum(sales*countweek, pmin(1:.N, 26L), adaptive = TRUE),
                          1L, 0, "lag"),
     by = .(product)]

data[, rollweekcount := shift(frollsum(countweek,  pmin(1:.N,  26L), adaptive = TRUE), 
                              1L, 0, "lag"), 
     by = .(product)]

顺序错误(product,week):找不到对象“product”现在应该可以工作了,包括data.table您可以使用
fifelse
cumsum
类似
data[,pastsales:=shift(fifelse)(is.na(x ICT),类似于
zoo
的“部分”?是的,但有一点不同。使用zoo,您只需将
partial=TRUE
,并将
width
保留为长度为1的整数。使用data.table,您需要指定所有窗口宽度的向量。
> data[product == 1]
     week product sales countweek pastsales rollweekcount baseline
...
 20:   20       1     1         0         0             0      NaN
 21:   21       1     2         0         0             0      NaN
 22:   22       1     1         1         0             0      NaN
 23:   23       1     0         0         0             0      NaN
 24:   24       1     3         1         0             0      NaN
 25:   25       1     5         1         0             0      NaN
 26:   26       1     5         1         0             0      NaN
 27:   27       1     1         1        44            13 3.384615
 28:   28       1     0         1        45            14 3.214286
 29:   29       1     5         0        44            14 3.142857
 30:   30       1     0         1        44            14 3.142857
 31:   31       1     3         1        44            14 3.142857
 32:   32       1     4         0        42            14 3.000000
...
data[, pastsales := shift(frollsum(sales*countweek, pmin(1:.N, 26L), adaptive = TRUE),
                          1L, 0, "lag"),
     by = .(product)]

data[, rollweekcount := shift(frollsum(countweek,  pmin(1:.N,  26L), adaptive = TRUE), 
                              1L, 0, "lag"), 
     by = .(product)]