[英]Finding a Weighted Average Based on Years
我想创建 2017 年至 2019 年棒球统计 WAR 的加权平均值。平均值将为 go 如下: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
现在我定义一个 function 使用权重计算平均值:
WAR_average <- function(i) {my_list[[i]] %>%
group_by(Name) %>%
mutate(WAR_average = sum(WAR * weights[[i]]))}
最后,我在my_list
上应用 function 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
这整个过程返回
# A tibble: 2 x 2
# Groups: Name [2]
Name WAR_average
<chr> <dbl>
1 A.J. Pollock 2.33
2 Aaron Hicks 4.24
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.