如何构造条件 运行 前 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"来判断晋升。基线需要满足以下要求:
- 每篇文章和类别,促销前三周需要计算为基线
- 基线应该是"running",即每个日历周都应该有一个基线
- 基线建设前三周内,不得有任何促销活动。如果有,则忽略该特定的一周,并采取更多的前一周,直到找到没有晋升的一周并达到三周。如果这是不可能的,例如CW 1-3,然后取下一个未来基线值
我尝试使用现有的 posts on Whosebug 来解决这个挑战,但没有成功。因此,我寻求帮助。
使用 dplyr 和 zoo 的解决方案可能如下所示:
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))
我有以下示例 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"来判断晋升。基线需要满足以下要求:
- 每篇文章和类别,促销前三周需要计算为基线
- 基线应该是"running",即每个日历周都应该有一个基线
- 基线建设前三周内,不得有任何促销活动。如果有,则忽略该特定的一周,并采取更多的前一周,直到找到没有晋升的一周并达到三周。如果这是不可能的,例如CW 1-3,然后取下一个未来基线值
我尝试使用现有的 posts on Whosebug 来解决这个挑战,但没有成功。因此,我寻求帮助。
使用 dplyr 和 zoo 的解决方案可能如下所示:
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))