找到基于年份的加权平均值

Finding a Weighted Average Based on Years

我想创建 2017 年至 2019 年棒球统计数据 WAR 的加权平均值。 平均值将如下所示: 2019:57.14% 2018:28.57% 2017 年:14.29%

不过有些选手只打了2018年和2019年,有些已经打过2019年和2017年了。 如果他们只打了两年,那就是 67/33,显然只有一年就是 100%。

我想知道是否有一种简单的方法可以做到这一点。 我的数据集如下所示

            Name Season   G  PA HR BB_pct K_pct   ISO  wOBA wRC_plus  Def WAR
337  A.J. Pollock   2017 112 466 14    7.5  15.2 0.205 0.340      103  2.6 2.2
357  A.J. Pollock   2018 113 460 21    6.7  21.7 0.228 0.338      111  0.9 2.6
191 Aaron Altherr   2017 107 412 19    7.8  25.2 0.245 0.359      120 -7.9 1.4
162   Aaron Hicks   2017  88 361 15   14.1  18.6 0.209 0.363      128  6.4 3.4
186   Aaron Hicks   2018 137 581 27   15.5  19.1 0.219 0.360      129  2.3 5.0
464   Aaron Hicks   2019  59 255 12   12.2  28.2 0.208 0.325      102  1.3 1.1

年份因人而异,但想知道是否有人有办法根据他们打球的年份来计算这个加权平均值。如果有意义的话,我也不想要任何 2017 年的人。

我想,有一种简单的方法可以完成您的任务。不幸的是,我的方法有点复杂。我正在使用 dplyrpurr

首先我将这些权重放入列表中:

one_year  <- 1
two_years <- c(2/3, 1/3)
three_years <- c(4/7, 3/7, 1/7)
weights <- list(one_year, two_years, three_years)

接下来,我将数据集按每个玩家参加的赛季数分成一个列表:

df %>%
  group_by(Name) %>%
  mutate(n=n()) %>%
  arrange(n) %>%
  ungroup() %>%
  group_split(n) -> my_list

现在我定义一个使用权重计算平均值的函数:

WAR_average <- function(i) {my_list[[i]] %>% 
                              group_by(Name) %>% 
                              mutate(WAR_average = sum(WAR * weights[[i]]))}

最后,我在 my_list 和 filter/select 数据上应用函数 WAR_average

my_list %>%
  seq_along() %>%
  lapply(WAR_average) %>%             # apply function
  reduce(rbind) %>%                   # bind the dataframes into one df
  filter(Season != 2017 | n != 1) %>% # filter players only active in 2017 
  select(Name, WAR_average) %>%       # select player and war_average
  distinct()                          # remove duplicates

这整个过程returns

# A tibble: 2 x 2
# Groups:   Name [2]
  Name         WAR_average
  <chr>              <dbl>
1 A.J. Pollock        2.33
2 Aaron Hicks         4.24