A proof-of-concept R package to help you find:

  • past and present team mates of named footballers
  • a single team mate shared by multiple players at some point

Read more in the accompanying blog post.

This package is dependent on the excellent {worldfootballR} package by Jason Zivkovic, which helps fetch player data from Transfermarkt.

[Insert gif of Kieran Dyer and Lee Bowyer fighting as Newcastle team mates]

You can install the package from GitHub. It uses the base R pipe (|>) internally, so you’ll need R >=v4.1.

remotes::install_github("matt-dray/soccercolleagues")
library(soccercolleagues)

Example: fetch all players from all seasons of the English Premier League. This will take several minutes.

epl_players <- get_players(
  seasons = 1992:2020,
  country = "England"
)

sample_n(epl_players, 5) |> 
  select(player_name, team_name, season)
## # A tibble: 5 × 3
##   player_name      team_name           season
##   <chr>            <chr>               <chr> 
## 1 Rob Lee          newcastle-united    1998  
## 2 Gordon Durie     tottenham-hotspur   1992  
## 3 Cheikhou Kouyaté west-ham-united     2017  
## 4 Daniel James     swansea-city        2016  
## 5 Julian Watts     sheffield-wednesday 1995  

From this, you can isolate all the team mates for a given player, or all the common team mates for several named players for the teams and season in which they played together.

get_colleagues(
  epl_players,
  c("Gary Neville", "Phil Neville")
) |>
  glimpse()
## Rows: 880
## Columns: 12
## $ focus_name     <chr> "Gary Neville", "Gary Neville", "Gary Neville", "Gary Neville", …
## $ player_name    <chr> "Kevin Pilkington", "Gary Walsh", "Peter Schmeichel", "Colin Mur…
## $ player_pos     <chr> "Goalkeeper", "Goalkeeper", "Goalkeeper", "Centre-Back", "Right-…
## $ player_age     <dbl> 18, 24, 28, 16, 28, 26, 31, 27, 18, 24, 18, 23, 17, 17, 17, 17, …
## $ nationality    <chr> "England", "England", "Denmark", "Northern Ireland", "England", …
## $ in_squad       <dbl> 1, 16, 46, 0, 36, 46, 47, 48, 0, 45, 45, 40, 3, 0, 1, 2, 30, 10,…
## $ appearances    <dbl> 0, 1, 46, 0, 35, 45, 47, 47, 0, 45, 45, 30, 1, 0, 0, 1, 29, 7, 2…
## $ goals          <dbl> 0, 0, 0, 0, 1, 5, 5, 1, 0, 6, 11, 3, 0, 0, 0, 0, 1, 1, 9, 9, 15,…
## $ minutes_played <dbl> 0, 90, 4170, 0, 3102, 3932, 4229, 4260, 0, 3890, 3871, 1546, 25,…
## $ team_url       <chr> "https://www.transfermarkt.com/manchester-united/startseite/vere…
## $ team_name      <chr> "manchester-united", "manchester-united", "manchester-united", "…
## $ season         <chr> "1992", "1992", "1992", "1992", "1992", "1992", "1992", "1992", …

Sample from all the current and former team mates of a named player or players. Sampling is weighted by total playing time, so well-known players are more likely to arise.

sample_colleagues(
  all_players = epl_players,
  players = c(
    "Shay Given",
    "Dwight Yorke",
    "El-Hadji Diouf",
    "Matthew Upson",
    "Leighton Baines"
  )
)
## [1] "Emile Heskey"

This is especially satisfying if they only have one player in common.

In the spirit of the ‘pub quiz’ nature of this, there’s also an extremely proof-of-concept Shiny app available with open_colleagues_quiz(). You’ll need to install {shiny} and {shinyjs} from CRAN before you use it.