library(tidyverse)
library(cfbfastR)
library(DT)3 WR Rankings
3.1 Packages Needed
3.2 Load Play-by-Play Data
pbp_2025 <- load_cfb_pbp(seasons = 2025) # mean epa/target3.3 Load WR Players
wrs <- read.csv("data/players.csv") %>% filter(position == "WR")3.4 Load Necessary CSV Files
receiving <- read.csv("data/receiving_summary.csv") %>%
select(player_id, grades_pass_route, yprr, drop_rate, contested_catch_rate) # rec grade, yprr, drop%, contested catch %3.5 Combine Datasets and Pull Names
wr_values <- wrs %>%
left_join(receiving, by = c("id" = "player_id")) %>%
drop_na()
wr_values <- wr_values %>%
rename(rec_grade = grades_pass_route, cc_rate = contested_catch_rate)
wr_names <- wr_values %>% pull(name)3.6 Calculate Mean EPA and Combine
receiver_epa <- pbp_2025 %>%
filter(pass == 1) %>%
group_by(receiver_player_name) %>%
summarize(mean_epa = round(mean(EPA, na.rm = TRUE), 3)) %>%
filter(!is.na(receiver_player_name), receiver_player_name %in% wr_names) %>%
rename(name = receiver_player_name) %>%
arrange(-mean_epa)
wr_values <- left_join(wr_values, receiver_epa, by = "name") %>% select(-id)3.7 Get Mean Values (for testing)
mean(wr_values$rec_grade)[1] 73.51746
mean(wr_values$yprr)[1] 2.052857
mean(wr_values$drop_rate)[1] 6.566667
mean(wr_values$cc_rate)[1] 48.31905
mean(wr_values$mean_epa)[1] 0.5302698
3.8 Create Rating Function
get_wr_ratings <- function(input_df) {
df_wr_copy <- input_df %>% mutate(
rec_grade = round(pmax(pmin((rec_grade-60) / 3, 10), 0), 2), # 60-90, mean 75
yprr = round(pmax(pmin((yprr-1.5) * 6.67, 10), 0), 2), # 1.5-3, mean 2.25
drop_rate = round(pmax(pmin(((100-drop_rate)-88), 10), 0), 2), # 12-2, mean 7
cc_rate = round(pmax(pmin((cc_rate-35) / 3, 10), 0), 2), # 35-65, mean 50
mean_epa = round(pmax(pmin((mean_epa) * 10, 10), 0), 2), # 0-1, mean .5
)
return(df_wr_copy)
}3.9 Create Final Dataset
wr_ratings <- get_wr_ratings(wr_values) %>%
mutate(total = rowSums(select(.,-name, -position, -team, -rank))) %>%
arrange(-total) #%>%
#mutate(pos_rank_aft = row_number())3.10 Display Ratings
datatable(wr_ratings)