# --- load teams
teams <- tibble::tibble(baseballr:::rds_from_url(
"https://raw.githubusercontent.com/robert-frey/college-baseball/main/ncaa_team_lookup.rds")
) |>
dplyr::filter(year == 2025 & division == 1)
acc_ids <- teams |>
dplyr::filter(conference == "ACC") |>
dplyr::pull(team_id)
# function to fetch results
acc_results <- function(id) {
collegebaseball::ncaa_schedule(team_id = id, year = 2025) |>
dplyr::filter(home_team_conference == "ACC" & away_team_conference == "ACC") |>
dplyr::filter(!is.na(home_team_score))
}
acc_scores <- lapply(acc_ids, acc_results)
# grab results and adjust spacing issue with Miami
acc_results_2025 <- as.data.frame(do.call(rbind, acc_scores)) |>
dplyr::distinct(contest_id, .keep_all = TRUE ) |>
dplyr::mutate(home_team = dplyr::if_else(home_team == "Miami (FL) ", "Miami (FL)",
home_team),
away_team = dplyr::if_else(away_team == "Miami (FL) ", "Miami (FL)",
away_team)
)
# find standings and run diffs
home_diffs <- acc_results_2025 |>
dplyr::mutate(h_diff = home_team_score - away_team_score) |>
dplyr::group_by(home_team) |>
dplyr::summarize(home_diff = sum(h_diff)) |>
dplyr::rename(team = home_team)
away_diffs <- acc_results_2025 |>
dplyr::mutate(a_diff = away_team_score - home_team_score) |>
dplyr::group_by(away_team) |>
dplyr::summarize(away_diff = sum(a_diff)) |>
dplyr::rename(team = away_team)
full_diffs <- merge(home_diffs, away_diffs, by = "team")|>
dplyr::mutate(full_diff = (home_diff + away_diff))|>
dplyr::select(team, full_diff, home_diff, away_diff)
home_results <- acc_results_2025 |>
dplyr::mutate(h_result = dplyr::if_else(home_team_score > away_team_score, "W", "L")) |>
dplyr::group_by(home_team, h_result) |>
dplyr::count() |>
tidyr::pivot_wider(
names_from = h_result,
values_from = n)|>
dplyr::rename(team = home_team, h_w = W, h_l = L)
away_results <- acc_results_2025 |>
dplyr::mutate(a_result = dplyr::if_else(away_team_score > home_team_score, "W", "L")) |>
dplyr::group_by(away_team, a_result) |>
dplyr::count() |>
tidyr::pivot_wider(
names_from = a_result,
values_from = n) |>
dplyr::rename(team = away_team, a_w = W, a_l = L) |>
dplyr::mutate(across(everything(), ~ replace(.x, is.na(.x), 0)))
# full run differentials
full_recs <- merge(home_results, away_results, by = "team") |>
dplyr::mutate(W = (h_w + a_w), L = (h_l + a_l))|>
dplyr::select(team, W, L, h_w, h_l, a_w, a_l)
diffs_recs <- merge(full_diffs, full_recs, by ="team")
# find leaders
leader_wins <- max(diffs_recs$W)
leader_losses <- min(diffs_recs$L[diffs_recs$W == leader_wins])
# standings
standings <- diffs_recs |>
dplyr::mutate(
GB = ((leader_wins - W) + (L - leader_losses)) / 2,
GB = ifelse(GB == 0, 0, GB),
Win_Pct = round(W / (W + L), 3)
) |>
dplyr::arrange(desc(Win_Pct)) |>
dplyr::mutate(
overall_rec = paste0(W, "-", L),
home_rec = paste0(h_w, "-", h_l),
away_rec = paste0(a_w, "-", a_l),
full_diff = ifelse(full_diff > 0,
paste0("+", full_diff),
full_diff),
record_diff = paste0(overall_rec, " | ",
sprintf("%.3f", Win_Pct))
) |>
dplyr::select(
team,
Win_Pct,
record_diff
)
acc_results_long <- dplyr::bind_rows(
acc_results_2025 |>
dplyr::transmute(
season = year,
date = as.Date(date, format = "%m/%d/%Y"),
team = home_team,
team_id = home_team_id,
team_score = home_team_score,
team_conference = home_team_conference,
opp = away_team,
opp_id = away_team_id,
opp_score = away_team_score,
opp_conference = away_team_conference,
location = dplyr::case_when(
neutral_site == "TRUE" ~ "neutral",
TRUE ~ "home"
),
contest_id
),
acc_results_2025 |>
dplyr::transmute(
season = year,
date = as.Date(date, format = "%m/%d/%Y"),
team = away_team,
team_id = away_team_id,
team_score = away_team_score,
team_conference = away_team_conference,
opp = home_team,
opp_id = home_team_id,
opp_score = home_team_score,
opp_conference = home_team_conference,
location = dplyr::case_when(
neutral_site == "TRUE" ~ "neutral",
TRUE ~ "away"
),
contest_id
)
)