簡體   English   中英

在 R 或 Power BI 中按類別組滾動 4 周平均值

[英]Rolling 4 week average by categorical group in R or power BI

我正在嘗試創建實際值列的滾動 4 周平均值並按州分組。

因此,從底部開始,最后一行中 TX 的 4 周平均值為 (1+ 0(5 月 22 日的那一周沒有銷售)+ 1+3)/ 4(周數)。

Week    State   Actuals
4/24/2022   CA  1
5/1/2022    CA  3
5/8/2022    CA  34
5/8/2022    NV  2
5/8/2022    AZ  1
5/8/2022    TX  3
5/15/2022   CA  27
5/15/2022   TX  1
5/22/2022   CA  15
5/29/2022   TX  1
5/29/2022   CA  24

比起 Power BI,我更喜歡 R,但兩者都很棒

使用complete包括缺少的周數,用 0 填充它們

 library(tidyverse)

 df %>%
   mutate(Week = as.Date(Week, "%m/%d/%Y")) %>%
   complete(Week, State, fill = list(Actuals = 0)) %>%
   group_by(State) %>%
   summarise(Results = zoo::rollmean(Actuals, 4), .groups = 'drop')

# A tibble: 12 x 2
   State Results
   <chr>   <dbl>
 1 AZ       0.25
 2 AZ       0.25
 3 AZ       0.25
 4 CA      16.2 
 5 CA      19.8 
 6 CA      25   
 7 NV       0.5 
 8 NV       0.5 
 9 NV       0.5 
10 TX       1   
11 TX       1   
12 TX       1.25

編輯:

如果你想保持一周使用stats::filter

df %>%
     mutate(Week = as.Date(Week, "%m/%d/%Y")) %>%
     complete(State, Week, fill = list(Actuals = 0)) %>%
     group_by(State) %>%
     mutate(Results = stats::filter(Actuals, rep(1,4)/4, sides = 1))
   State       Week Actuals Results
1     AZ 2022-04-24       0      NA
2     AZ 2022-05-01       0      NA
3     AZ 2022-05-08       1      NA
4     AZ 2022-05-15       0    0.25
5     AZ 2022-05-22       0    0.25
6     AZ 2022-05-29       0    0.25
7     CA 2022-04-24       1      NA
8     CA 2022-05-01       3      NA
9     CA 2022-05-08      34      NA
10    CA 2022-05-15      27   16.25
11    CA 2022-05-22      15   19.75
12    CA 2022-05-29      24   25.00
13    NV 2022-04-24       0      NA
14    NV 2022-05-01       0      NA
15    NV 2022-05-08       2      NA
16    NV 2022-05-15       0    0.50
17    NV 2022-05-22       0    0.50
18    NV 2022-05-29       0    0.50
19    TX 2022-04-24       0      NA
20    TX 2022-05-01       0      NA
21    TX 2022-05-08       3      NA
22    TX 2022-05-15       1    1.00
23    TX 2022-05-22       0    1.00
24    TX 2022-05-29       1    1.25

使用您的數據:

x <- "
Week    State   Actuals
4/24/2022   CA  1
5/1/2022    CA  3
5/8/2022    CA  34
5/8/2022    NV  2
5/8/2022    AZ  1
5/8/2022    TX  3
5/15/2022   CA  27
5/15/2022   TX  1
5/22/2022   CA  15
5/29/2022   TX  1
5/29/2022   CA  24
"
df <- read.table(textConnection(x) , header = TRUE)
df

從一開始每 4 周計算一次平均值

#===================================

library(dplyr , warn.conflicts = FALSE)

df$Week <- as.Date(df$Week , format = "%m/%d/%y")

uw <- unique(df$Week)

weeks <- list()
for(i in 1:ceiling(length(uw)/4)){
  s <- i*4 - 3
  weeks[[i]] <- df %>% filter( Week %in% uw[s:(s+3)]) %>% group_by(State) %>%
    summarise(Avg = format(round(mean(Actuals) , 3) , 3))
}
#===================================

前 4 周:

weeks[[1]] 

#> # A tibble: 4 × 2
#>   State   Avg
#>   <chr> <dbl>
#> 1 AZ      1  
#> 2 CA     16.25
#> 3 NV      2  
#> 4 TX      2

第二個 4 周:

weeks[[2]]

#> # A tibble: 2 × 2
#>   State   Avg
#>   <chr> <dbl>
#> 1 CA     19.5
#> 2 TX      1

reprex 包(v2.0.1)於 2022-06-08 創建

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM