计算R中最近3周的平均值和std值

计算R中最近3周的平均值和std值,r,average,tidyverse,R,Average,Tidyverse,我有一个数据框,如下面的示例数据。我想为每天添加两列,以显示过去3周内同一天的平均销售额和std销售额。我的意思是前三天,最后三个星期二,最后三个星期三,等等 df <- data.frame( stringsAsFactors = FALSE, date = c("3/28/2019","3/27/2019", "3/26/2019","3/

我有一个数据框,如下面的示例数据。我想为每天添加两列,以显示过去3周内同一天的平均销售额和std销售额。我的意思是前三天,最后三个星期二,最后三个星期三,等等

df <- data.frame(
  stringsAsFactors = FALSE,
              date = c("3/28/2019","3/27/2019",
                       "3/26/2019","3/25/2019","3/24/2019","3/23/2019",
                       "3/22/2019","3/21/2019","3/20/2019","3/19/2019","3/18/2019",
                       "3/17/2019","3/16/2019","3/15/2019","3/14/2019",
                       "3/13/2019","3/12/2020","3/11/2020","3/10/2020","3/9/2021",
                       "3/8/2021","3/7/2021","3/6/2022","3/5/2022",
                       "3/4/2022","3/3/2023"),
           weekday = c(4L,3L,2L,1L,7L,6L,5L,4L,
                       3L,2L,1L,7L,6L,5L,4L,3L,2L,1L,7L,6L,5L,4L,
                       3L,2L,1L,7L),
          store_id = c(344L,344L,344L,344L,344L,
                       344L,344L,344L,344L,344L,344L,344L,344L,344L,344L,
                       344L,344L,344L,344L,344L,344L,344L,344L,344L,
                       344L,344L),
       store_sales = c(1312005L,1369065L,1354185L,
                       1339183L,973780L,1112763L,1378349L,1331890L,1357713L,
                       1366399L,1303573L,936919L,1099826L,1406752L,
                       1318841L,1321099L,1387767L,1281097L,873449L,1003667L,
                       1387767L,1281097L,873449L,1003667L,1331636L,1303804L)
)
我们可以按工作日分组,存储_id,并使用zoo::rollappyr计算最后3个条目的滚动平均值


注意,我已经使用窗口大小为4,并从平均计算中删除第一个条目,因此它不考虑当前值而取平均值。如果partial=TRUE,则即使最后一个值小于4,也会取平均值。

无缺失天数,数据包含所有天数的日期
date    weekday store_id    store_sales avg_sameday3
3/28/2019   4   344         1312005      1310609 
library(dplyr)

df %>%
  arrange(weekday) %>%
  group_by(store_id, weekday) %>%
  mutate(store_sales_avg = zoo::rollapplyr(store_sales, 4, 
                                 function(x) mean(x[-1]), partial = TRUE))