I want to cross-tabulate football games over several years.
Setting up example pairings:
Please note that there can be up to 20 clubs and a couple of thousand matches!
teams = {"Arsenal", "Brighton", "Chelsea"};
n = 30; (* number of matches *)
SeedRandom[0];
games = RandomChoice[Permutations[teams, {2}], n]
{{"Chelsea", "Brighton"}, {"Arsenal", "Chelsea"}, {"Arsenal", "Brighton"}, {"Chelsea", "Arsenal"}, {"Arsenal", "Brighton"}, {"Chelsea", "Arsenal"}, {"Arsenal", "Chelsea"}, {"Brighton", "Arsenal"}, {"Arsenal", "Chelsea"}, {"Arsenal", "Brighton"}, {"Brighton", "Chelsea"}, {"Brighton", "Chelsea"}, {"Chelsea", "Arsenal"}, {"Brighton", "Arsenal"}, {"Arsenal", "Brighton"}, {"Chelsea", "Arsenal"}, {"Arsenal", "Chelsea"}, {"Brighton", "Chelsea"}, {"Arsenal", "Brighton"}, {"Brighton", "Chelsea"}, {"Chelsea", "Arsenal"}, {"Arsenal", "Chelsea"}, {"Brighton", "Arsenal"}, {"Chelsea", "Brighton"}, {"Brighton", "Arsenal"}, {"Brighton", "Arsenal"}, {"Arsenal", "Chelsea"}, {"Brighton", "Arsenal"}, {"Brighton", "Chelsea"}, {"Arsenal", "Chelsea"}}
It should be noted that (unlike a yearly league) games per team might be different:
Chelsea has played 19 games (over several years),
Total @ Cases[{x : {_, _}, c_} /; MemberQ[x, "Chelsea"] :> c] @ Tally @ games
19
but Arsenal had 23 matches.
Awarding points:
SeedRandom[0];
points = RandomChoice[{3, 1, 0}, n];
{0, 0, 1, 3, 3, 0, 3, 3, 0, 3, 1, 1, 1, 0, 3, 3, 3, 1, 0, 1, 0, 0, 3, 0, 3, 1, 3, 3, 0, 1}
games = Transpose[{games, points}];
If there is a draw both teams must get 1 point:
draws = games /. {{a_String, b_}, 1} :> Splice[{{{a, b}, 1}, {{b, a}, 1}}];
For a lost game the other team must get three points:
data = draws /. {{a_String, b_}, 0} :> Splice[{{{a, b}, 0}, {{b, a}, 3}}] // Sort
{{{"Arsenal", "Brighton"}, 0}, {{"Arsenal", "Brighton"}, 1}, {{"Arsenal", "Brighton"}, 1}, {{"Arsenal", "Brighton"}, 3}, {{"Arsenal", "Brighton"}, 3}, {{"Arsenal", "Brighton"}, 3}, {{"Arsenal", "Brighton"}, 3}, {{"Arsenal", "Chelsea"}, 0}, {{"Arsenal", "Chelsea"}, 0}, {{"Arsenal", "Chelsea"}, 0}, {{"Arsenal", "Chelsea"}, 1}, {{"Arsenal", "Chelsea"}, 1}, {{"Arsenal", "Chelsea"}, 3}, {{"Arsenal", "Chelsea"}, 3}, {{"Arsenal", "Chelsea"}, 3}, {{"Arsenal", "Chelsea"}, 3}, {{"Arsenal", "Chelsea"}, 3}, {{"Brighton", "Arsenal"}, 0}, {{"Brighton", "Arsenal"}, 1}, {{"Brighton", "Arsenal"}, 1}, {{"Brighton", "Arsenal"}, 3}, {{"Brighton", "Arsenal"}, 3}, {{"Brighton", "Arsenal"}, 3}, {{"Brighton", "Arsenal"}, 3}, {{"Brighton", "Arsenal"}, 3}, {{"Brighton", "Chelsea"}, 0}, {{"Brighton", "Chelsea"}, 1}, {{"Brighton", "Chelsea"}, 1}, {{"Brighton", "Chelsea"}, 1}, {{"Brighton", "Chelsea"}, 1}, {{"Brighton", "Chelsea"}, 3}, {{"Brighton", "Chelsea"}, 3}, {{"Chelsea", "Arsenal"}, 0}, {{"Chelsea", "Arsenal"}, 0}, {{"Chelsea", "Arsenal"}, 1}, {{"Chelsea", "Arsenal"}, 1}, {{"Chelsea", "Arsenal"}, 3}, {{"Chelsea", "Arsenal"}, 3}, {{"Chelsea", "Arsenal"}, 3}, {{"Chelsea", "Arsenal"}, 3}, {{"Chelsea", "Arsenal"}, 3}, {{"Chelsea", "Brighton"}, 0}, {{"Chelsea", "Brighton"}, 0}, {{"Chelsea", "Brighton"}, 1}, {{"Chelsea", "Brighton"}, 1}, {{"Chelsea", "Brighton"}, 1}, {{"Chelsea", "Brighton"}, 1}, {{"Chelsea", "Brighton"}, 3}}
Expected result:
This is as far as I got, but I couldn't find a presentable way to build a pairing matrix. Doing it manually counting the above points gives:
result =
<|"Arsenal" -> <|"Rank" -> 1, "Arsenal" -> 0, "Brighton" -> 14, "Chelsea" -> 17, "Total" -> 31|>,
"Brighton" -> <|"Rank" -> 2, "Arsenal" -> 17, "Brighton" -> 0, "Chelsea" -> 10, "Total" -> 27|>,
"Chelsea" -> <|"Rank" -> 3, "Arsenal" -> 17, "Brighton" -> 7, "Chelsea" -> 0, "Total" -> 24|>|>;
result // Dataset
The result doesn't need to be a Dataset - I welcome any matrix-like solution.





