How to calculate weighted average using slide_index_dbl()?

In R I’m looking to create a row calculation that averages prices based on Product type and a date range based on Order_Date. Additionally, I need to weight the average using quantity. In the example from Excel, I’m using a SUMPRODUCT function that has three criteria: 1) Product type, 2) beginning date, and 3) ending date. For example Product type is --(A:A=A4). These three criteria then calculate a sum product of Price and Quantity. Lastly, I’m dividing the sum product by the sum of Quantity based on the previously mentioned criteria.

Here’s my dataset:

structure(list(Product = c("A", "B", "B", "F", "D", "F", "A", 
"F", "D", "A", "A", "D", "C", "C", "A", "B", "C", "A", "B", "A", 
"A", "E", "D", "F", "B", "B", "E", "F", "F", "E", "F", "A", "A", 
"D", "F", "C", "C", "C", "A", "D", "D", "E", "D", "B", "C", "B", 
"D", "F", "C", "A", "A", "F", "D", "E", "B", "B", "A", "E", "A", 
"D", "E", "C", "C", "C", "E", "D", "F", "E", "B", "E", "D", "B", 
"A", "B", "D", "F", "C", "C", "E", "A", "A", "F", "D", "D", "A", 
"F", "C", "A", "A", "F", "A", "B", "A", "D", "C", "C", "A", "B", 
"E", "B", "D", "B", "F", "F", "B", "C", "B", "B", "C", "F", "A", 
"B", "A", "E", "C", "E", "E", "E", "D", "B", "C", "D", "B", "C", 
"F", "F", "C", "F", "D", "F", "A", "D", "B", "B", "C", "E", "B"
), Price = c(6.502, 4.526, 2.272, 9.097, 0.594, 5.41, 9.85, 1.197, 
5.09, 7.343, 3.339, 1.107, 7.993, 7.922, 4.558, 4.75, 1.278, 
9.55, 8.223, 6.195, 0.668, 9.741, 9.679, 3.488, 4.159, 3.756, 
6.233, 7.658, 8.896, 9.724, 6.582, 7.422, 1.172, 2.734, 4.917, 
0.784, 9.284, 0.7, 6.869, 3.054, 9.945, 4.173, 5.217, 6.016, 
5.559, 5.247, 7.024, 8.845, 8.436, 7.482, 8.609, 3.675, 2.76, 
5.357, 4.125, 3.199, 7.736, 5.255, 5.581, 5.282, 2.753, 1.568, 
2.083, 8.938, 7.562, 7.513, 9.493, 8.404, 5.266, 9.992, 3.813, 
5.522, 6.295, 5.385, 1.91, 3.597, 4.105, 9.484, 6.697, 4.818, 
1.644, 2.699, 0.608, 9.6, 0.447, 4.123, 2.997, 5.085, 0.903, 
5.455, 1.869, 4.053, 8.843, 1.171, 8.491, 9.236, 5.642, 6.565, 
3.168, 4.367, 6.008, 6.267, 8.363, 0.318, 5.226, 6.597, 2.932, 
3.149, 8.578, 1.814, 9.288, 9.96, 8.44, 3.514, 2.832, 5.881, 
4.57, 7.646, 2.19, 5.446, 5.318, 3.674, 6.235, 9.414, 7.201, 
9.846, 0.824, 0.757, 4.928, 0.499, 9.165, 1.564, 6.944, 3.474, 
8.537, 5.412, 7.142), Quantity = c(25, 33, 25, 12, 39, 28, 24, 
2, 8, 22, 18, 14, 38, 42, 41, 7, 20, 5, 48, 40, 8, 11, 48, 34, 
45, 14, 27, 2, 36, 33, 36, 37, 5, 30, 44, 41, 4, 42, 29, 41, 
32, 47, 22, 48, 30, 39, 44, 15, 34, 33, 41, 43, 3, 34, 8, 40, 
28, 10, 16, 40, 33, 37, 1, 17, 21, 25, 26, 50, 37, 43, 8, 22, 
45, 13, 19, 27, 39, 42, 10, 39, 45, 43, 23, 22, 38, 38, 31, 49, 
46, 13, 27, 33, 23, 5, 20, 21, 27, 27, 12, 31, 38, 12, 28, 39, 
23, 50, 6, 11, 6, 19, 9, 3, 2, 39, 37, 45, 34, 46, 33, 34, 46, 
46, 34, 45, 50, 17, 12, 22, 50, 37, 43, 6, 21, 27, 29, 12, 40
), Order_Date = structure(c(19208, 19210, 19337, 19288, 19339, 
19318, 19352, 19290, 19245, 19317, 19352, 19177, 19306, 19300, 
19196, 19314, 19270, 19212, 19232, 19199, 19238, 19274, 19265, 
19311, 19257, 19344, 19294, 19331, 19181, 19348, 19317, 19332, 
19334, 19338, 19184, 19274, 19240, 19350, 19195, 19306, 19198, 
19283, 19260, 19263, 19177, 19197, 19186, 19205, 19264, 19328, 
19268, 19190, 19210, 19300, 19273, 19188, 19280, 19264, 19211, 
19241, 19296, 19350, 19260, 19201, 19254, 19262, 19176, 19175, 
19335, 19179, 19196, 19190, 19253, 19178, 19190, 19234, 19253, 
19310, 19323, 19325, 19258, 19292, 19213, 19269, 19225, 19299, 
19350, 19224, 19193, 19250, 19242, 19260, 19340, 19276, 19211, 
19222, 19305, 19305, 19273, 19268, 19306, 19277, 19225, 19188, 
19190, 19181, 19268, 19291, 19272, 19238, 19184, 19228, 19199, 
19237, 19205, 19251, 19357, 19238, 19288, 19301, 19331, 19260, 
19320, 19175, 19253, 19312, 19354, 19357, 19176, 19187, 19225, 
19281, 19352, 19315, 19246, 19308, 19356), class = "Date"), Weighted_Mean = c(4.86222058823529, 
4.91654166666667, 4.63969072164948, 4.04514736842105, 1.5244347826087, 
5.89505982905983, 7.69063076923077, 4.04514736842105, 4.61877586206897, 
6.47659493670886, 7.69063076923077, 4.78144881889764, 8.48185245901639, 
8.48185245901639, 4.94103365384615, 5.4376511627907, 3.90273529411765, 
5.61707339449541, 8.32517647058824, 5.04922535211268, 4.75870476190476, 
4.9231, 6.86458333333333, 5.4318954248366, 4.67877914110429, 
5.37029197080292, 4.59054248366013, 6.11739393939394, 4.32138666666667, 
7.10853731343284, 5.89505982905983, 6.79381761006289, 6.70562773722628, 
1.5244347826087, 4.32138666666667, 3.90273529411765, 6.17783333333333, 
1.55910655737705, 4.887703125, 4.47491139240506, 5.55313178294574, 
4.61875384615385, 6.94804093567251, 4.75871584699454, 7.362, 
4.60912738853503, 5.72447904191617, 5.01206896551724, 3.95868085106383, 
6.79381761006289, 5.8291320754717, 4.6041125, 5.62133333333333, 
4.77567924528302, 4.95427536231884, 4.70277372262774, 8.25473913043478, 
6.27438383838384, 5.44942084942085, 5.25, 4.59054248366013, 1.55910655737705, 
4.73968823529412, 5.76418918918919, 6.26311842105263, 6.86458333333333, 
4.32138666666667, 9.13823655913978, 4.69287272727273, 9.13823655913978, 
6.6261320754717, 4.70277372262774, 4.61464457831325, 4.48619387755102, 
5.72447904191617, 4.94255405405405, 6.85711214953271, 8.48185245901639, 
5.99609090909091, 6.79381761006289, 5.4215572519084, 4.04514736842105, 
5.87075862068965, 6.68180459770115, 5.0480251572327, 4.59084246575342, 
1.55910655737705, 5.0480251572327, 4.887703125, 5.67598780487805, 
4.238525, 4.65287134502924, 6.78867597765363, 6.84263309352518, 
6.53164210526316, 8.87258536585366, 6.40571428571429, 5.25782857142857, 
4.9231, 4.75871584699454, 4.47491139240506, 5.03948275862069, 
4.94255405405405, 4.32138666666667, 4.70277372262774, 7.362, 
4.75871584699454, 5.62216666666667, 3.90273529411765, 5.81543065693431, 
4.64604191616766, 8.32517647058824, 5.04922535211268, 5.79543846153846, 
5.76418918918919, 5.99229192546584, 7.10853731343284, 5.79543846153846, 
1.98884090909091, 4.94439622641509, 5.318, 6.94804093567251, 
5.38738636363636, 7.362, 5.67598780487805, 5.4318954248366, 1.55910655737705, 
0.757, 4.78144881889764, 4.32138666666667, 5.0480251572327, 4.52589393939394, 
5.40888, 5.4376511627907, 6.1217397260274, 4.94131034482759, 
6.45450666666667)), row.names = c(NA, -137L), class = "data.frame")

Here’s my Excel function:
Excel function

Here’s what I’ve tried in R:

df <- df %>%
  arrange(Order_Date) %>%
  mutate(
    WAVG = slide_index_dbl(
      Price,
      Order_Date, 
      ~weighted.mean(
        Price,
        Quantity
      ), 
      .before = days(15), .after = days(15)
    ),
    .by = Product
  )

While WAVG does calculate, it doesn’t tie-out to my Weighted_Mean column from my Excel spreadsheet (column E). Here is the output from the code:

c(6.3222426035503, 5.6334269005848, 4.89748936170213, 4.90580536912752, 
4.90580536912752, 5.6334269005848, 5.22891776798825, 6.3222426035503, 
4.89748936170213, 5.6334269005848, 4.89748936170213, 5.55218692810458, 
4.90580536912752, 4.89748936170213, 5.22891776798825, 4.89748936170213, 
4.89748936170213, 5.22891776798825, 4.90580536912752, 5.22891776798825, 
5.55218692810458, 5.55218692810458, 5.55218692810458, 4.90580536912752, 
5.22891776798825, 4.90580536912752, 5.55218692810458, 5.55218692810458, 
5.6334269005848, 4.89748936170213, 5.6334269005848, 5.55218692810458, 
5.22891776798825, 4.90580536912752, 5.55218692810458, 5.6334269005848, 
5.55218692810458, 4.90580536912752, 5.6334269005848, 5.55218692810458, 
5.55218692810458, 4.89748936170213, 5.55218692810458, 5.22891776798825, 
5.22891776798825, 4.89748936170213, 6.3222426035503, 5.55218692810458, 
4.89748936170213, 6.3222426035503, 5.6334269005848, 4.90580536912752, 
5.55218692810458, 4.90580536912752, 5.6334269005848, 4.89748936170213, 
6.3222426035503, 5.55218692810458, 5.6334269005848, 4.89748936170213, 
6.3222426035503, 5.22891776798825, 5.55218692810458, 4.90580536912752, 
5.6334269005848, 5.22891776798825, 4.90580536912752, 4.90580536912752, 
5.22891776798825, 5.6334269005848, 6.3222426035503, 4.90580536912752, 
5.55218692810458, 5.22891776798825, 5.22891776798825, 4.90580536912752, 
5.6334269005848, 5.6334269005848, 5.22891776798825, 6.3222426035503, 
6.3222426035503, 5.6334269005848, 4.90580536912752, 5.22891776798825, 
5.55218692810458, 4.90580536912752, 6.3222426035503, 4.89748936170213, 
4.90580536912752, 4.89748936170213, 5.22891776798825, 4.89748936170213, 
6.3222426035503, 6.3222426035503, 4.89748936170213, 5.6334269005848, 
6.3222426035503, 5.22891776798825, 5.55218692810458, 5.22891776798825, 
5.6334269005848, 4.90580536912752, 4.90580536912752, 6.3222426035503, 
5.6334269005848, 4.89748936170213, 4.89748936170213, 5.22891776798825, 
5.22891776798825, 5.55218692810458, 4.89748936170213, 4.89748936170213, 
5.22891776798825, 6.3222426035503, 5.55218692810458, 5.55218692810458, 
4.89748936170213, 5.6334269005848, 5.55218692810458, 5.55218692810458, 
5.22891776798825, 5.22891776798825, 4.90580536912752, 4.90580536912752, 
5.55218692810458, 5.22891776798825, 6.3222426035503, 5.6334269005848, 
5.6334269005848, 5.6334269005848, 5.55218692810458, 5.55218692810458, 
5.22891776798825, 5.6334269005848, 5.22891776798825, 6.3222426035503, 
4.89748936170213)

Here is the View(df):
enter image description here

>Solution :

df %>%
  arrange(Order_Date) %>%
  mutate(
    WAVG = slide_index2_dbl(
      Price,
      Quantity,
      Order_Date, 
      ~sum(.x * .y) / sum(.y),
      .before = days(15), .after = days(15)
    ),
    .by = Product
  )

Leave a Reply