找到基于年份的加权平均值
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 年的人。
我想,有一种简单的方法可以完成您的任务。不幸的是,我的方法有点复杂。我正在使用 dplyr
和 purr
。
首先我将这些权重放入列表中:
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
我想创建 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 年的人。
我想,有一种简单的方法可以完成您的任务。不幸的是,我的方法有点复杂。我正在使用 dplyr
和 purr
。
首先我将这些权重放入列表中:
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