This package is designed to allow users to extract various world football results and player statistics from the following popular football (soccer) data sites:
You can install the CRAN version of worldfootballR
with:
install.packages("worldfootballR")
You can install the released version of worldfootballR
from GitHub with:
# install.packages("devtools")
::install_github("JaseZiv/worldfootballR") devtools
library(worldfootballR)
library(dplyr)
library(tidyr)
Package vignettes have been built to help you get started with the package.
This vignette will cover the functions to extract data from fotmob.com
There are currently no helper functions for fotmob functions.
fotmob has data for just about every league that you can think of, including all of the Big 5 leagues.
Use fotmob_get_season_stats
to retrieve values for a specified stat, season, and league. Currently the available stat types are:
sub_stat_value
column)sub_stat_value
column)<- fotmob_get_season_stats(
epl_team_xg_2021 country = "ENG",
league_name = "Premier League",
season = "2020/2021",
stat_type = "xg",
team_or_player = "team"
)
%>%
epl_team_xg_2021 ::select(
dplyrleague_id = id,
league_name = name,
season_id,
season_name,
team_id,team_name = participant_name,
matches_played,xg = stat_value,
g = sub_stat_value
%>%
) ::glimpse()
dplyr#> Rows: 20
#> Columns: 9
#> $ league_id <int> 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,…
#> $ league_name <chr> "Premier League", "Premier League", "Premier League", "…
#> $ season_id <int> 15382, 15382, 15382, 15382, 15382, 15382, 15382, 15382,…
#> $ season_name <chr> "2020/2021", "2020/2021", "2020/2021", "2020/2021", "20…
#> $ team_id <int> 8456, 8650, 8455, 10260, 8654, 8463, 8197, 8586, 10252,…
#> $ team_name <chr> "Manchester City", "Liverpool", "Chelsea", "Manchester …
#> $ matches_played <int> 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,…
#> $ xg <dbl> 68.91, 68.36, 62.95, 60.86, 56.72, 56.36, 56.11, 53.77,…
#> $ g <dbl> 83, 68, 58, 73, 62, 62, 68, 68, 55, 55, 40, 47, 46, 47,…
You can retrieve data for multiple leagues and/or season at the same time.
<- fotmob_get_season_stats(
team_xg_conceded_2021 country = c("ITA", "ESP"),
league_name = c("Serie A", "LaLiga"),
season = c("2020/2021", "2021/2022"),
stat_type = "xg_conceded",
team_or_player = "team"
)
## 2 leagues x 20 teams x 2 seasons = 80 records
%>% nrow()
team_xg_conceded_2021 #> [1] 80
At this time, only one stat_type
and one team_or_player
can be retrieved at a time.
You can also use fotmob_get_season_stats
to retrieve stats for players.
<- fotmob_get_season_stats(
epl_player_xg_2021 country = "ENG",
league_name = "Premier League",
season = "2020/2021",
stat_type = "xg",
team_or_player = "player"
)
%>%
epl_player_xg_2021 ::select(
dplyrleague_id = id,
league_name = name,
season_id,
season_name,
team_id,## NOTE: particiant_id is a typo on behalf of fotmob! We leave it as is.
player_id = particiant_id,
player_name = participant_name,
minutes_played,
matches_played,xg = stat_value,
g = sub_stat_value
%>%
) ::glimpse()
dplyr#> Rows: 433
#> Columns: 11
#> $ league_id <int> 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,…
#> $ league_name <chr> "Premier League", "Premier League", "Premier League", "…
#> $ season_id <int> 15382, 15382, 15382, 15382, 15382, 15382, 15382, 15382,…
#> $ season_name <chr> "2020/2021", "2020/2021", "2020/2021", "2020/2021", "20…
#> $ team_id <int> 8586, 8197, 8650, 8463, 8668, 10260, 10252, 8650, 8654,…
#> $ player_id <int> 194165, 286119, 292462, 302241, 612150, 422685, 540088,…
#> $ player_name <chr> "Harry Kane", "Jamie Vardy", "Mohamed Salah", "Patrick …
#> $ minutes_played <int> 3085, 2844, 3079, 3062, 2874, 3105, 3329, 2810, 1983, 2…
#> $ matches_played <int> 35, 34, 37, 38, 33, 37, 37, 35, 26, 33, 33, 26, 36, 31,…
#> $ xg <dbl> 20.23, 19.93, 19.32, 18.27, 16.31, 16.10, 14.55, 14.17,…
#> $ g <dbl> 23, 15, 22, 17, 16, 18, 14, 11, 10, 8, 12, 12, 9, 13, 6…
Matches for one or multiple leagues can be retrieved with fotmob_get_league_matches
. Currently only the current season’s matches can be retrieved.
<- fotmob_get_league_matches(
league_matches country = c("ENG", "ESP" ),
league_name = c("Premier League", "LaLiga")
)
<- league_matches %>%
league_matches_unnested ::select(match_id = id, home, away) %>%
dplyr::unnest_wider(c(home, away), names_sep = "_")
tidyr::glimpse(league_matches_unnested)
dplyr#> Rows: 760
#> Columns: 7
#> $ match_id <chr> "3609929", "3609934", "3609930", "3609931", "3609932", "360…
#> $ home_id <chr> "9937", "10260", "8191", "8455", "8668", "8197", "9817", "9…
#> $ home_name <chr> "Brentford", "Man United", "Burnley", "Chelsea", "Everton",…
#> $ home_score <int> 2, 5, 1, 3, 3, 1, 3, 0, 2, 1, 2, 2, 0, 2, 5, 2, 1, 0, 0, 4,…
#> $ away_id <chr> "9825", "8463", "10204", "9826", "8466", "8602", "10252", "…
#> $ away_name <chr> "Arsenal", "Leeds", "Brighton", "Crystal Palace", "Southamp…
#> $ away_score <int> 0, 1, 2, 0, 1, 0, 2, 3, 4, 0, 0, 0, 0, 2, 0, 0, 1, 1, 2, 1,…
fotmob also lists data for all leagues by date. Use fotmob_get_matches_by_date
to select matches occurring on specific day(s) and filter down to the league(s) that you care about.
<- fotmob_get_matches_by_date(date = c("20210925", "20210926"))
results ::glimpse(results)
dplyr#> Rows: 244
#> Columns: 12
#> $ ccode <chr> "ENG", "GER", "ENG", "ESP", "INT", "ALB", "ARG", "A…
#> $ id <int> 47, 54, 873679, 87, 871358, 260, 872538, 874057, 87…
#> $ primary_id <int> 47, 54, 48, 87, 114, 260, 9213, 112, 9213, 8965, 11…
#> $ name <chr> "Premier League", "1. Bundesliga", "Championship", …
#> $ matches <list> [<data.frame[2 x 11]>], [<data.frame[1 x 11]>], [<…
#> $ internal_rank <int> 30, 20, 29, 10, 0, 0, 7, 9, 7, 8, 8, 11, 9, 0, 9, 1…
#> $ live_rank <int> 101, 100, 0, 100, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
#> $ simple_league <lgl> FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FAL…
#> $ parent_league_id <int> NA, NA, 48, NA, 114, NA, 9213, 112, 9213, 8965, 119…
#> $ is_group <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ group_name <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
#> $ parent_league_name <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
<- results %>%
filtered_results ::select(primary_id, ccode, league_name = name, matches) %>%
dplyr::filter(league_name == "Premier League", ccode == "ENG")
dplyr
# one way of getting data out of the results
<- filtered_results %>%
unnested_results ::unnest_longer(matches)
tidyr
<- unnested_results %>%
match_ids ::pull(matches) %>%
dplyr::pull(id)
dplyr
match_ids#> [1] 3609981 3609986 3609983 3609984 3609985 3609988 3609980
Note that fotmob returns nested data.frames or lists for some elements. Nested components have camel case names.
%>%
unnested_results ::pull(matches) %>%
dplyr::glimpse()
dplyr#> Rows: 7
#> Columns: 11
#> $ id <int> 3609981, 3609986, 3609983, 3609984, 3609985, 3609988,…
#> $ leagueId <int> 47, 47, 47, 47, 47, 47, 47
#> $ time <chr> "25.09.2021 13:30", "25.09.2021 13:30", "25.09.2021 1…
#> $ home <df[,4]> <data.frame[7 x 4]>
#> $ away <df[,4]> <data.frame[7 x 4]>
#> $ eliminatedTeamId <lgl> NA, NA, NA, NA, NA, NA, NA
#> $ statusId <int> 6, 6, 6, 6, 6, 6, 6
#> $ tournamentStage <chr> "6", "6", "6", "6", "6", "6", "6"
#> $ status <df[,7]> <data.frame[7 x 7]>
#> $ timeTS <dbl> 1.632605e+12, 1.632605e+12, 1.632614e+12, 1.632614e+1…
#> $ tv <lgl> NA, NA, NA, NA, NA, NA, NA
Standings for one or multiple leagues can be retrieved with fotmob_get_league_tables
. Currently only the current season’s standings can be retrieved.
<- fotmob_get_league_tables(
league_tables country = c("ENG", "ESP" ),
league_name = c("Premier League", "LaLiga")
)# or
# league_tables <- fotmob_get_league_tables(league_id = c(47, 87))
<- league_tables %>%
away_league_tables ::filter(table_type == "away")
dplyr::glimpse(away_league_tables)
dplyr#> Rows: 40
#> Columns: 14
#> $ table_type <chr> "away", "away", "away", "away", "away", "away", "away", …
#> $ name <chr> "Man City", "Liverpool", "Chelsea", "Wolves", "Man Unite…
#> $ id <int> 8456, 8650, 8455, 8602, 10260, 8586, 9825, 8654, 10204, …
#> $ page_url <chr> "/teams/8456/overview/manchester-city", "/teams/8650/ove…
#> $ deduction <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
#> $ played <int> 15, 15, 15, 15, 14, 15, 13, 15, 14, 15, 14, 15, 15, 15, …
#> $ wins <int> 11, 10, 10, 8, 6, 7, 7, 6, 4, 6, 3, 4, 3, 3, 3, 3, 3, 1,…
#> $ draws <int> 3, 3, 3, 2, 5, 2, 1, 3, 7, 0, 6, 3, 4, 4, 4, 4, 3, 6, 2,…
#> $ losses <int> 1, 2, 2, 5, 3, 6, 5, 6, 3, 9, 5, 8, 8, 8, 7, 8, 7, 7, 10…
#> $ scores_str <chr> "28-8", "38-13", "29-9", "15-11", "24-22", "21-20", "20-…
#> $ goal_con_diff <int> 20, 25, 20, 4, 2, 1, 1, 3, 0, -2, -4, -6, -11, -12, -15,…
#> $ pts <int> 36, 33, 33, 26, 23, 23, 22, 21, 19, 18, 15, 15, 13, 13, …
#> $ idx <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1…
#> $ qual_color <chr> "#2AD572", "#2AD572", "#2AD572", "#2AD572", "#0046A7", N…
To get shooting locations for an individual match along with expected goals (xG), expected goals on target (xGoT), etc., use the fotmob_get_match_details()
function.
<- c(3609994, 3610132)
fotmob_matches <- fotmob_get_match_details(fotmob_matches)
match_details ::glimpse(match_details)
dplyr#> Rows: 2
#> Columns: 15
#> $ match_id <chr> "3609994", "3610132"
#> $ match_round <chr> "7", "21"
#> $ league_id <int> 47, 47
#> $ league_name <chr> "Premier League", "Premier League"
#> $ league_round_name <chr> "Premier League Round 7", "Premier League Round 2…
#> $ parent_league_id <int> 47, 47
#> $ parent_league_season <chr> "2021/2022", "2021/2022"
#> $ match_time_utc <chr> "Sun, Oct 3, 2021, 15:30 UTC", "Sun, Jan 2, 2022,…
#> $ home_team_id <int> 8650, 8455
#> $ home_team <chr> "Liverpool", "Chelsea"
#> $ home_team_color <chr> "#d3171e", "#064b95"
#> $ away_team_id <int> 8456, 8650
#> $ away_team <chr> "Manchester City", "Liverpool"
#> $ away_team_color <chr> "#69A8D8", "#d3171e"
#> $ shots <list> [<data.frame[18 x 24]>], [<data.frame[25 x 24]>]
<- match_details %>%
match_shots ::select(
dplyr
match_id,
shots%>%
) ::unnest(shots)
tidyr::glimpse(match_shots)
dplyr#> Rows: 43
#> Columns: 25
#> $ match_id <chr> "3609994", "3609994", "3609994", "3609994", "…
#> $ id <dbl> 2338869639, 2338876703, 2338881401, 233888382…
#> $ event_type <chr> "AttemptSaved", "AttemptSaved", "AttemptSaved…
#> $ team_id <int> 8650, 8456, 8456, 8456, 8456, 8456, 8456, 845…
#> $ player_id <int> 292462, 312765, 815006, 169200, 169200, 16920…
#> $ player_name <chr> "Mohamed Salah", "Jack Grealish", "Phil Foden…
#> $ x <dbl> 92.50000, 91.50000, 100.35345, 97.57017, 97.0…
#> $ y <dbl> 50.72688, 49.53580, 42.00375, 46.31286, 28.95…
#> $ min <int> 8, 15, 21, 24, 34, 38, 40, 40, 50, 59, 63, 67…
#> $ min_added <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
#> $ is_blocked <lgl> TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, …
#> $ is_on_target <lgl> TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, F…
#> $ blocked_x <dbl> 94.48246, 93.40000, 101.87069, 104.05172, NA,…
#> $ blocked_y <dbl> 48.20459, 47.57401, 39.54500, 0.00000, NA, 28…
#> $ goal_crossed_y <dbl> 34.6100000, 34.8387500, 32.7800000, 0.3279621…
#> $ goal_crossed_z <dbl> 1.21999999, 1.21999999, 0.36600000, 0.5329473…
#> $ expected_goals <dbl> 0.04540855, 0.04835442, 0.63251555, 0.0870914…
#> $ expected_goals_on_target <dbl> NA, NA, 0.6931, NA, NA, NA, NA, NA, 0.0412, 0…
#> $ shot_type <chr> "LeftFoot", "RightFoot", "LeftFoot", "LeftFoo…
#> $ situation <chr> "FromCorner", "RegularPlay", "RegularPlay", "…
#> $ period <chr> "FirstHalf", "FirstHalf", "FirstHalf", "First…
#> $ is_own_goal <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FAL…
#> $ on_goal_shot <df[,3]> <data.frame[26 x 3]>
#> $ first_name <chr> "Mohamed", "Jack", "Phil", "Kevin", "Kevin…
#> $ last_name <chr> "Salah", "Grealish", "Foden", "De Bruyne", "D…
There is one nested element in the returned data.frame for on_goal_shot
. As with the nested elements returned by fotmob_get_matches_by_date
, columns in nested elements have camel case names. (Here, it’s only zoomRatio
.)
NOTE: The below code block depends on tidyr 1.2.0
%>%
match_shots ::select(on_goal_shot) %>%
dplyr::unnest_wider(
tidyr
on_goal_shot
)#> # A tibble: 43 × 3
#> x y zoomRatio
#> <dbl> <dbl> <dbl>
#> 1 0.839 0.323 1
#> 2 0.778 0.323 1
#> 3 1.32 0.0968 1
#> 4 2 0.0158 0.112
#> 5 1.38 0.677 0.461
#> 6 1.14 0.323 1
#> 7 1.14 0.323 1
#> 8 0 0.0255 0.181
#> 9 1.26 0.216 1
#> 10 0.476 0.0221 1
#> # … with 33 more rows
Be very careful with interpreting x
and y
from on_goal_shot
. They’re not on the same scale as x
and y
in the top-level of the result returned from fotmob_get_match_details
!
You can also extract players from matches with the fotmob_get_match_players()
function.
<- fotmob_get_match_players(fotmob_matches)
players ::glimpse(players)
dplyr#> Rows: 80
#> Columns: 29
#> $ id <chr> "319784", "38807", "171698", "209405", "357880",…
#> $ using_opta_id <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,…
#> $ first_name <chr> "Alisson", "James", "Joel", "Virgil", "Andrew", …
#> $ last_name <chr> "Becker", "Milner", "Matip", "van Dijk", "Robert…
#> $ image_url <chr> "https://images.fotmob.com/image_resources/playe…
#> $ page_url <chr> "/players/319784/alisson-becker", "/players/3880…
#> $ shirt <chr> "1", "7", "32", "4", "26", "14", "3", "17", "11"…
#> $ is_home_team <lgl> TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, …
#> $ time_subbed_on <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
#> $ time_subbed_off <int> NA, 78, NA, NA, NA, NA, NA, NA, NA, 68, NA, NA, …
#> $ usual_position <int> 0, 2, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 2, 2, …
#> $ position_row <int> 0, 1, 1, 1, 1, 3, 3, 3, 5, 5, 5, 5, 5, 5, 3, 3, …
#> $ role <chr> "Keeper", "Midfielder", "Defender", "Defender", …
#> $ is_captain <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, …
#> $ subbed_out <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
#> $ g <int> NA, NA, NA, NA, NA, NA, NA, NA, 1, NA, 1, 1, NA,…
#> $ rating_num <chr> "5.7", "7.2", "7.3", "6.6", "7.2", "7.2", "6.3",…
#> $ rating_bgcolor <chr> "#f08022", "#1ec853", "#1ec853", "#f08022", "#1e…
#> $ is_top_rating <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,…
#> $ is_match_finished <lgl> TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, …
#> $ fantasy_score_num <chr> "1", "1", "1", "1", "1", "2", "1", "5 + 2", "10 …
#> $ fantasy_score_bgcolor <chr> "purple", "purple", "purple", "purple", "purple"…
#> $ home_team_id <int> 8650, 8650, 8650, 8650, 8650, 8650, 8650, 8650, …
#> $ home_team_color <chr> "#d3171e", "#d3171e", "#d3171e", "#d3171e", "#d3…
#> $ away_team_id <int> 8456, 8456, 8456, 8456, 8456, 8456, 8456, 8456, …
#> $ away_team_color <chr> "#69A8D8", "#69A8D8", "#69A8D8", "#69A8D8", "#69…
#> $ stats <list> [<data.frame[1 x 15]>], [<data.frame[4 x 22]>],…
#> $ shotmap <list> <NULL>, <NULL>, <NULL>, <NULL>, <NULL>, <NULL>,…
#> $ is_starter <lgl> TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, …
<- players %>% dplyr::filter(id == "292462")
salah <- salah %>%
salah_shotmap ::select(player_id = id, shotmap) %>%
dplyr::unnest(shotmap)
tidyr::glimpse(salah_shotmap)
dplyr#> Rows: 7
#> Columns: 23
#> $ player_id <chr> "292462", "292462", "292462", "292462", "292462"…
#> $ id <dbl> 2338869639, 2338938757, 2338947917, 2371191153, …
#> $ eventType <chr> "AttemptSaved", "AttemptSaved", "Goal", "Attempt…
#> $ teamId <int> 8650, 8650, 8650, 8650, 8650, 8650, 8650
#> $ playerId <int> 292462, 292462, 292462, 292462, 292462, 292462, …
#> $ playerName <chr> "Mohamed Salah", "Mohamed Salah", "Mohamed Salah…
#> $ x <dbl> 92.50000, 80.57039, 101.87069, 90.00000, 101.396…
#> $ y <dbl> 50.72688, 45.26191, 24.27949, 33.31375, 24.13936…
#> $ min <int> 8, 63, 76, 6, 26, 36, 57
#> $ minAdded <lgl> NA, NA, NA, NA, NA, NA, NA
#> $ isBlocked <lgl> TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE
#> $ isOnTarget <lgl> TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE
#> $ blockedX <dbl> 94.48246, 90.80000, NA, 97.76316, NA, 93.10000, …
#> $ blockedY <dbl> 48.20459, 40.97381, NA, 33.69500, NA, 30.22000, …
#> $ goalCrossedY <dbl> 34.61000, 33.39000, 37.27875, 34.68625, 32.01750…
#> $ goalCrossedZ <dbl> 1.220000, 1.220000, 1.136526, 0.854000, 1.014526…
#> $ expectedGoals <dbl> 0.04540855, 0.04966947, 0.29863000, 0.17881796, …
#> $ expectedGoalsOnTarget <dbl> NA, NA, 0.9744, 0.1107, 0.2217, NA, 0.2100
#> $ shotType <chr> "LeftFoot", "LeftFoot", "RightFoot", "RightFoot"…
#> $ situation <chr> "FromCorner", "FreeKick", "RegularPlay", "Regula…
#> $ period <chr> "FirstHalf", "SecondHalf", "SecondHalf", "FirstH…
#> $ isOwnGoal <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE
#> $ onGoalShot <df[,3]> <data.frame[7 x 3]>
<- salah %>%
salah_stats ::select(player_id = id, stats) %>%
dplyr::unnest(stats)
tidyr::glimpse(salah_stats)
dplyr#> Rows: 6
#> Columns: 25
#> $ player_id <chr> "292462", "292462", "292462", "29…
#> $ stats_fot_mob_rating <dbl> 8.85, 6.14, 7.42, 8.15, 5.54, 7.99
#> $ stats_minutes_played <dbl> 90, 68, 90, 89, 69, 90
#> $ stats_goals <dbl> 1, 0, 1, 1, 0, 1
#> $ stats_assists <dbl> 1, 0, 0, 0, 0, 0
#> $ stats_total_shots <dbl> 3, 1, 1, 2, 0, 4
#> $ stats_key_passes <dbl> 2, 0, 0, 1, 0, 2
#> $ stats_expected_goals_x_g <dbl> 0.39, 0.10, 0.25, 0.82, NA, 0.71
#> $ stats_expected_goals_on_target_x_got <dbl> 0.97, 0.04, 0.83, 0.55, NA, 0.54
#> $ stats_expected_assists_x_a <dbl> 0.29, 0.01, NA, 0.05, 0.03, 0.04
#> $ stats_blocked_shots <dbl> 2, NA, NA, NA, NA, 1
#> $ stats_touches <dbl> 49, 26, 33, 48, 39, 41
#> $ stats_dispossessed <dbl> 1, 1, 1, 2, 3, 1
#> $ stats_clearances <dbl> 1, NA, NA, 2, NA, NA
#> $ stats_headed_clearance <dbl> 1, NA, NA, 2, NA, NA
#> $ stats_interceptions <dbl> 1, 1, 1, 1, NA, 1
#> $ stats_recoveries <dbl> 1, 4, 3, 4, 4, 2
#> $ stats_dribbled_past <dbl> 1, 2, NA, NA, 1, NA
#> $ stats_was_fouled <dbl> 1, 2, 2, 1, 1, 0
#> $ stats_fouls_committed <dbl> 0, 3, 2, 1, 4, 1
#> $ stats_fantasy_points <dbl> NA, 2, 7, 6, 5, 7
#> $ stats_tackles_won <dbl> NA, 0, 0, NA, 0, 0
#> $ stats_offsides <dbl> NA, NA, NA, 1, 1, 1
#> $ stats_big_chance_missed <dbl> NA, NA, NA, NA, NA, 1
#> $ stats_aerial_duels_won <dbl> NA, NA, NA, NA, NA, 0