如何构造条件 运行 前 3 周的平均值?

How to construct a conditional running average with 3 weeks prior to the condition?

我有以下示例 df,由一个类别 (Cat) 组成,其中显示了不同的 articles(披萨或意大利面)以及不同日历周 (CW) 的 sales 数据。在某些周内会有促销活动,这会导致销量上升。 6个最大的销售额被标记为此类促销。

# example df
set.seed(99999)

df <- data.frame(Cat = rep(c("A","B"),52),
                 Article = rep(c("Pizza","Pasta"),52))
df <- df[order(df$Cat),]
df$CW <- rep(1:52,2)
df$sales <- abs(2+rnorm(104))
df$promotion <- ifelse(rank(df$sales,ties.method=c("last"))>98,1,0)

现在的挑战是计算一个"baseline"来判断晋升。基线需要满足以下要求:

我尝试使用现有的 posts on Whosebug 来解决这个挑战,但没有成功。因此,我寻求帮助。

使用 dplyrzoo 的解决方案可能如下所示:

library(dplyr)
library(zoo)

df2 <- df %>%
  arrange(Cat,Article,CW) %>%
  group_by(Cat,Article,stimulus) %>%
  mutate(Baseline=rollapplyr(sales,list(-(3:1)),mean,fill=NA))%>%
  ungroup()%>%
  mutate(Baseline=ifelse(stimulus==1,lead(Baseline,n=1L),Baseline))