【问题标题】:How to construct a conditional running average with 3 weeks prior to the condition?如何构建条件前 3 周的条件运行平均值?
【发布时间】:2020-04-02 09:20:53
【问题描述】:

我有以下示例 df,其中包含一个类别 (Cat),其中显示了不同的文章(比萨饼或意大利面)及其 销售额 不同日历周的数据 (CW)。几周后会有促销,导致销售额上升。最大的 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)

现在的挑战是计算判断促销活动的“基准”。基线需要满足以下要求:

  • 每个文章和类别,需要在促销前三周计算为基线
  • 基线应该是“正在运行”,即每个日历周都应该有一个基线
  • 在基线建设的前三周内,不得有任何晋升。如果有,则忽略该特定周,并采取更多的前一周,直到找到没有晋升的一周并达到三周。如果这不应该是可能的,例如CW 1-3,然后采用下一个未来基线值

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

【问题讨论】:

  • 亲爱的@Ronak Shah,你能帮我解决这个问题吗?我非常感谢您对我之前的question 的帮助:)

标签: r moving-average promotions


【解决方案1】:

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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    相关资源
    最近更新 更多