9.8 Make a Schedule

make_schedule <- function(teams, k) {
  # INPUTS:
      ## teams: vector of team names
      ## k: number of games played between two teams in the first team’s home park
  # OUTPUT: tibble with baseball season schedule
  num_teams <- length(teams)
  Home <- rep(rep(teams, each = num_teams), k)
  Visitor <- rep(rep(teams, num_teams), k)
  tibble(Home = Home, Visitor = Visitor) |>
    filter(Home != Visitor)
}

to construct the schedule for the 1968 season

teams_68 <- Lahman::Teams |>
  filter(yearID == 1968) |>
  select(teamID, lgID) |>
  mutate(teamID = as.character(teamID)) |>
  group_by(lgID)

schedule <- teams_68 |>
  group_split() |>
  set_names(pull(group_keys(teams_68), "lgID")) |>
  map(~make_schedule(teams = .x$teamID, k = 9)) |>
  list_rbind(names_to = "lgID")

“Note that schedule has \(\frac{162 \cdot 20}{2}\) rows [permutations], since each game involves two teams.”. For example, we simulate the 1968 Detroit Tigers’ schedule as

Detroit Tigers 1968 Schedule
via simple construction
game_num lgID Home Visitor
1 AL BAL DET
2 AL BOS DET
3 AL CAL DET
4 AL CHA DET
5 AL CLE DET
6 AL DET BAL
7 AL DET BOS
8 AL DET CAL
9 AL DET CHA
10 AL DET CLE
11 AL DET MIN
12 AL DET NYA
13 AL DET OAK
14 AL DET WS2
15 AL MIN DET
16 AL NYA DET
17 AL OAK DET
18 AL WS2 DET
19 AL BAL DET
20 AL BOS DET
21 AL CAL DET
22 AL CHA DET
23 AL CLE DET
24 AL DET BAL
25 AL DET BOS
26 AL DET CAL
27 AL DET CHA
28 AL DET CLE
29 AL DET MIN
30 AL DET NYA
31 AL DET OAK
32 AL DET WS2
33 AL MIN DET
34 AL NYA DET
35 AL OAK DET
36 AL WS2 DET
37 AL BAL DET
38 AL BOS DET
39 AL CAL DET
40 AL CHA DET
41 AL CLE DET
42 AL DET BAL
43 AL DET BOS
44 AL DET CAL
45 AL DET CHA
46 AL DET CLE
47 AL DET MIN
48 AL DET NYA
49 AL DET OAK
50 AL DET WS2
51 AL MIN DET
52 AL NYA DET
53 AL OAK DET
54 AL WS2 DET
55 AL BAL DET
56 AL BOS DET
57 AL CAL DET
58 AL CHA DET
59 AL CLE DET
60 AL DET BAL
61 AL DET BOS
62 AL DET CAL
63 AL DET CHA
64 AL DET CLE
65 AL DET MIN
66 AL DET NYA
67 AL DET OAK
68 AL DET WS2
69 AL MIN DET
70 AL NYA DET
71 AL OAK DET
72 AL WS2 DET
73 AL BAL DET
74 AL BOS DET
75 AL CAL DET
76 AL CHA DET
77 AL CLE DET
78 AL DET BAL
79 AL DET BOS
80 AL DET CAL
81 AL DET CHA
82 AL DET CLE
83 AL DET MIN
84 AL DET NYA
85 AL DET OAK
86 AL DET WS2
87 AL MIN DET
88 AL NYA DET
89 AL OAK DET
90 AL WS2 DET
91 AL BAL DET
92 AL BOS DET
93 AL CAL DET
94 AL CHA DET
95 AL CLE DET
96 AL DET BAL
97 AL DET BOS
98 AL DET CAL
99 AL DET CHA
100 AL DET CLE
101 AL DET MIN
102 AL DET NYA
103 AL DET OAK
104 AL DET WS2
105 AL MIN DET
106 AL NYA DET
107 AL OAK DET
108 AL WS2 DET
109 AL BAL DET
110 AL BOS DET
111 AL CAL DET
112 AL CHA DET
113 AL CLE DET
114 AL DET BAL
115 AL DET BOS
116 AL DET CAL
117 AL DET CHA
118 AL DET CLE
119 AL DET MIN
120 AL DET NYA
121 AL DET OAK
122 AL DET WS2
123 AL MIN DET
124 AL NYA DET
125 AL OAK DET
126 AL WS2 DET
127 AL BAL DET
128 AL BOS DET
129 AL CAL DET
130 AL CHA DET
131 AL CLE DET
132 AL DET BAL
133 AL DET BOS
134 AL DET CAL
135 AL DET CHA
136 AL DET CLE
137 AL DET MIN
138 AL DET NYA
139 AL DET OAK
140 AL DET WS2
141 AL MIN DET
142 AL NYA DET
143 AL OAK DET
144 AL WS2 DET
145 AL BAL DET
146 AL BOS DET
147 AL CAL DET
148 AL CHA DET
149 AL CLE DET
150 AL DET BAL
151 AL DET BOS
152 AL DET CAL
153 AL DET CHA
154 AL DET CLE
155 AL DET MIN
156 AL DET NYA
157 AL DET OAK
158 AL DET WS2
159 AL MIN DET
160 AL NYA DET
161 AL OAK DET
162 AL WS2 DET
table code
schedule |>
  filter(Home == "DET" | Visitor == "DET") |>
  mutate(game_num = 1:162, .before = lgID) |>
  gt() |>
  cols_align(align = "center") |>
  tab_header(title = "Detroit Tigers 1968 Schedule",
             subtitle = "via simple construction") |>
  tab_style(
    locations = cells_body(columns = Home, rows = Home == "DET" ),
    style = list(cell_fill(color = "#FA4616"), cell_text(color = "#0C2340"))) |>
  tab_style(
    locations = cells_body(columns = Visitor, rows = Visitor == "DET" ),
    style = list(cell_fill(color = "#FA4616"), cell_text(color = "#0C2340"))) |>
  tab_style(
    locations = cells_body(columns = Home, rows = Home != "DET" ),
    style = list(cell_fill(color = "#0C2340"), cell_text(color = "#FA4616"))) |>
  tab_style(
    locations = cells_body(columns = Visitor, rows = Visitor != "DET" ),
    style = list(cell_fill(color = "#0C2340"), cell_text(color = "#FA4616")))