Using StatsBombR to obtain soccer data

Event level soccer data

This post shows how I used the ‘StatsBombR’ R package to get freely available soccer data provided by StatsBomb. StatsBomb is a sports data company and they provide free online samples of some of their professional level data. One way to access this free data is through their StatsBombR R package. Using this package I demonstrate how to extract the event level dataset for the 2019 Champions League final between Liverpool and Tottenham Hotspur.

Firstly, I load the required libraries for this post.

# Load required libraries
library(StatsBombR)
library(tidyverse)

Using the FreeCompetitions() function from StatsBombR I obtain all the competitions that have free data available. For those competitions, I obtain the matches with free data. This results in 40 competitions with a total of 1,096 matches.

# Get the data via StatsBombR package
comps <- FreeCompetitions() # get the available competitions (40x12)
glimpse(comps)
## Rows: 40
## Columns: 12
## $ competition_id            <int> 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, ~
## $ season_id                 <int> 4, 1, 2, 27, 26, 25, 24, 23, 22, 21, 41, 39,~
## $ country_name              <chr> "Europe", "Europe", "Europe", "Europe", "Eur~
## $ competition_name          <chr> "Champions League", "Champions League", "Cha~
## $ competition_gender        <chr> "male", "male", "male", "male", "male", "mal~
## $ competition_youth         <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FA~
## $ competition_international <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FA~
## $ season_name               <chr> "2018/2019", "2017/2018", "2016/2017", "2015~
## $ match_updated             <chr> "2021-08-27T11:26:39.802832", "2021-08-27T11~
## $ match_updated_360         <chr> "2021-06-13T16:17:31.694", "2021-06-13T16:17~
## $ match_available_360       <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, ~
## $ match_available           <chr> "2021-07-09T14:06:05.802", "2021-01-23T21:55~

Using the FreeMatches() function from StatsBombR I obtain all the matches that have free data available. This dataset corresponds to this dataset in my Github repo, which I use in some other blog posts.

matches <- FreeMatches(comps) # get the available matches in those competitions (1,096x42)
glimpse(matches)
## Rows: 1,096
## Columns: 42
## $ match_id                       <int> 22912, 18245, 18244, 18243, 18242, 1824~
## $ match_date                     <chr> "2019-06-01", "2018-05-26", "2017-06-03~
## $ kick_off                       <chr> "21:00:00.000", "20:45:00.000", "20:45:~
## $ home_score                     <int> 0, 3, 1, 1, 1, 4, 1, 1, 3, 0, 2, 2, 3, ~
## $ away_score                     <int> 2, 1, 4, 1, 3, 1, 2, 1, 1, 2, 0, 1, 3, ~
## $ match_status                   <chr> "available", "available", "available", ~
## $ match_status_360               <chr> "scheduled", "scheduled", "scheduled", ~
## $ last_updated                   <chr> "2020-07-29T05:00", "2021-01-23T21:55:3~
## $ last_updated_360               <chr> "2021-06-13T16:17:31.694", "2021-06-13T~
## $ match_week                     <int> 13, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,~
## $ competition.competition_id     <int> 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,~
## $ competition.country_name       <chr> "Europe", "Europe", "Europe", "Europe",~
## $ competition.competition_name   <chr> "Champions League", "Champions League",~
## $ season.season_id               <int> 4, 1, 2, 27, 26, 25, 24, 23, 22, 21, 41~
## $ season.season_name             <chr> "2018/2019", "2017/2018", "2016/2017", ~
## $ home_team.home_team_id         <int> 38, 220, 224, 220, 224, 220, 180, 169, ~
## $ home_team.home_team_name       <chr> "Tottenham Hotspur", "Real Madrid", "Ju~
## $ home_team.home_team_gender     <chr> "male", "male", "male", "male", "male",~
## $ home_team.home_team_group      <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ home_team.managers             <list> [<data.frame[1 x 6]>], [<data.frame[1 ~
## $ home_team.country.id           <int> 68, 214, 112, 214, 112, 214, 85, 85, 21~
## $ home_team.country.name         <chr> "England", "Spain", "Italy", "Spain", "~
## $ away_team.away_team_id         <int> 24, 24, 220, 212, 217, 212, 169, 33, 39~
## $ away_team.away_team_name       <chr> "Liverpool", "Liverpool", "Real Madrid"~
## $ away_team.away_team_gender     <chr> "male", "male", "male", "male", "male",~
## $ away_team.away_team_group      <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ away_team.managers             <list> [<data.frame[1 x 6]>], [<data.frame[1 ~
## $ away_team.country.id           <int> 68, 68, 214, 214, 214, 214, 85, 68, 68,~
## $ away_team.country.name         <chr> "England", "England", "Spain", "Spain",~
## $ metadata.data_version          <chr> "1.1.0", "1.1.0", "1.0.3", "1.0.3", "1.~
## $ metadata.shot_fidelity_version <chr> "2", "2", NA, NA, NA, NA, NA, NA, NA, N~
## $ metadata.xy_fidelity_version   <chr> "2", "2", NA, NA, NA, NA, NA, NA, NA, N~
## $ competition_stage.id           <int> 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,~
## $ competition_stage.name         <chr> "Final", "Final", "Final", "Final", "Fi~
## $ stadium.id                     <int> 4654, 4222, 113891, 388, 367, 611, 4666~
## $ stadium.name                   <chr> "Estadio Wanda Metropolitano", "NSK Oli~
## $ stadium.country.id             <int> 214, 238, 249, 112, 85, 183, 68, 85, 68~
## $ stadium.country.name           <chr> "Spain", "Ukraine", "Wales", "Italy", "~
## $ referee.id                     <int> 420, 727, 186, 728, 581, 287, 419, 717,~
## $ referee.name                   <chr> "Damir Skomina", "Milorad Mažić", "Fe~
## $ referee.country.id             <int> 208, 203, 85, 68, 233, 160, 112, 183, 1~
## $ referee.country.name           <chr> "Slovenia", "Serbia", "Germany", "Engla~

The last step is to extract the event level data for a specific match. For this, I chose the 2019 Champions League final between Liverpool and Tottenham Hotspur.

# Match number you want to select from the matches dataframe
selected_match <- 1 # Liv v Spurs is the first entry

# Select Liverpool v Spurs 2019 Champions League Final
match_1 <- get.matchFree(matches[selected_match, ]) # (3,165x120)

# Apply the StatsBomb allclean function to get the base dataset
# The allclean() function cleans and enriches the dataset for use
match_1_clean <- allclean(match_1) # (3,165x157)
glimpse(match_1_clean)
## Rows: 3,165
## Columns: 157
## $ id                             <chr> "c4341845-358d-43e7-9af4-9a39aa1d90f1",~
## $ index                          <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ~
## $ period                         <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ~
## $ timestamp                      <chr> "00:00:00.000", "00:00:00.000", "00:00:~
## $ minute                         <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
## $ second                         <int> 0, 0, 0, 0, 0, 1, 1, 3, 5, 5, 7, 7, 8, ~
## $ possession                     <int> 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, ~
## $ duration                       <dbl> 0.000000, 0.000000, 0.000000, 0.000000,~
## $ related_events                 <list> <NULL>, <NULL>, "97668e09-1ce7-4752-91~
## $ location                       <list> <NULL>, <NULL>, <NULL>, <NULL>, <61, 4~
## $ under_pressure                 <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ off_camera                     <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ counterpress                   <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ out                            <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ type.id                        <int> 35, 35, 18, 18, 30, 42, 43, 30, 42, 30,~
## $ type.name                      <chr> "Starting XI", "Starting XI", "Half Sta~
## $ possession_team.id             <int> 38, 38, 38, 38, 24, 24, 24, 24, 24, 24,~
## $ possession_team.name           <chr> "Tottenham Hotspur", "Tottenham Hotspur~
## $ play_pattern.id                <int> 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, ~
## $ play_pattern.name              <chr> "Regular Play", "Regular Play", "Regula~
## $ team.id                        <int> 38, 24, 24, 38, 24, 24, 24, 24, 24, 38,~
## $ team.name                      <chr> "Tottenham Hotspur", "Liverpool", "Live~
## $ tactics.formation              <int> 4231, 433, NA, NA, NA, NA, NA, NA, NA, ~
## $ tactics.lineup                 <list> [<data.frame[11 x 5]>], [<data.frame[1~
## $ player.id                      <int> NA, NA, NA, NA, 3532, 3502, 3502, 3502,~
## $ player.name                    <chr> NA, NA, NA, NA, "Jordan Brian Henderson~
## $ position.id                    <int> NA, NA, NA, NA, 13, 3, 3, 3, 21, 2, 23,~
## $ position.name                  <chr> NA, NA, NA, NA, "Right Center Midfield"~
## $ pass.length                    <dbl> NA, NA, NA, NA, 26.360956, NA, NA, 64.7~
## $ pass.angle                     <dbl> NA, NA, NA, NA, 3.00076870, NA, NA, -0.~
## $ pass.end_location              <list> <NULL>, <NULL>, <NULL>, <NULL>, <34.9,~
## $ pass.switch                    <lgl> NA, NA, NA, NA, NA, NA, NA, TRUE, NA, N~
## $ pass.aerial_won                <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ pass.through_ball              <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ pass.inswinging                <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ pass.straight                  <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ pass.cross                     <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ pass.assisted_shot_id          <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ pass.shot_assist               <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ pass.outswinging               <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ pass.cut_back                  <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ pass.deflected                 <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ pass.goal_assist               <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ pass.recipient.id              <int> NA, NA, NA, NA, 3502, NA, NA, 3629, NA,~
## $ pass.recipient.name            <chr> NA, NA, NA, NA, "Joël Andre Job Matip",~
## $ pass.height.id                 <int> NA, NA, NA, NA, 1, NA, NA, 3, NA, 3, NA~
## $ pass.height.name               <chr> NA, NA, NA, NA, "Ground Pass", NA, NA, ~
## $ pass.body_part.id              <int> NA, NA, NA, NA, 40, NA, NA, 40, NA, 37,~
## $ pass.body_part.name            <chr> NA, NA, NA, NA, "Right Foot", NA, NA, "~
## $ pass.type.id                   <int> NA, NA, NA, NA, 65, NA, NA, NA, NA, 66,~
## $ pass.type.name                 <chr> NA, NA, NA, NA, "Kick Off", NA, NA, NA,~
## $ pass.outcome.id                <int> NA, NA, NA, NA, NA, NA, NA, 9, NA, 9, N~
## $ pass.outcome.name              <chr> NA, NA, NA, NA, NA, NA, NA, "Incomplete~
## $ pass.technique.id              <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ pass.technique.name            <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ carry.end_location             <list> <NULL>, <NULL>, <NULL>, <NULL>, <NULL>~
## $ ball_receipt.outcome.id        <int> NA, NA, NA, NA, NA, NA, NA, NA, 9, NA, ~
## $ ball_receipt.outcome.name      <chr> NA, NA, NA, NA, NA, NA, NA, NA, "Incomp~
## $ duel.type.id                   <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ duel.type.name                 <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ duel.outcome.id                <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ duel.outcome.name              <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ foul_committed.penalty         <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ foul_committed.advantage       <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ foul_committed.offensive       <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ foul_committed.type.id         <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ foul_committed.type.name       <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ shot.statsbomb_xg              <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ shot.end_location              <list> <NULL>, <NULL>, <NULL>, <NULL>, <NULL>~
## $ shot.freeze_frame              <list> <NULL>, <NULL>, <NULL>, <NULL>, <NULL>~
## $ shot.key_pass_id               <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ shot.first_time                <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ shot.aerial_won                <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ shot.technique.id              <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ shot.technique.name            <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ shot.body_part.id              <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ shot.body_part.name            <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ shot.type.id                   <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ shot.type.name                 <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ shot.outcome.id                <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ shot.outcome.name              <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ goalkeeper.end_location        <list> <NULL>, <NULL>, <NULL>, <NULL>, <NULL>~
## $ goalkeeper.punched_out         <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ goalkeeper.position.id         <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ goalkeeper.position.name       <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ goalkeeper.type.id             <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ goalkeeper.type.name           <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ goalkeeper.outcome.id          <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ goalkeeper.outcome.name        <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ goalkeeper.technique.id        <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ goalkeeper.technique.name      <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ goalkeeper.body_part.id        <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ goalkeeper.body_part.name      <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ clearance.head                 <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ clearance.aerial_won           <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ clearance.right_foot           <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ clearance.left_foot            <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ clearance.other                <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ clearance.body_part.id         <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ clearance.body_part.name       <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ foul_won.advantage             <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ foul_won.defensive             <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ interception.outcome.id        <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ interception.outcome.name      <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ ball_recovery.recovery_failure <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ dribble.overrun                <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ dribble.nutmeg                 <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ dribble.outcome.id             <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ dribble.outcome.name           <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ `50_50.outcome.id`             <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ `50_50.outcome.name`           <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ substitution.outcome.id        <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ substitution.outcome.name      <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ substitution.replacement.id    <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ substitution.replacement.name  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ block.deflection               <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ block.offensive                <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ match_id                       <int> 22912, 22912, 22912, 22912, 22912, 2291~
## $ competition_id                 <int> 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,~
## $ season_id                      <int> 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, ~
## $ location.x                     <dbl> NA, NA, NA, NA, 61.0, 34.9, 34.9, 37.0,~
## $ location.y                     <dbl> NA, NA, NA, NA, 41.0, 44.7, 44.7, 44.9,~
## $ carry.end_location.x           <dbl> NA, NA, NA, NA, NA, NA, 37.0, NA, NA, N~
## $ carry.end_location.y           <dbl> NA, NA, NA, NA, NA, NA, 44.9, NA, NA, N~
## $ pass.end_location.x            <dbl> NA, NA, NA, NA, 34.9, NA, NA, 87.5, NA,~
## $ pass.end_location.y            <dbl> NA, NA, NA, NA, 44.7, NA, NA, 4.4, NA, ~
## $ shot.end_location.x            <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ shot.end_location.y            <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ shot.end_location.z            <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ shot_impact_height             <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ player.name.GK                 <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ player.id.GK                   <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ location.x.GK                  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ location.y.GK                  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ DistToGoal                     <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ DistToKeeper                   <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ AngleToGoal                    <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ AngleToKeeper                  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ AngleDeviation                 <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ avevelocity                    <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ DistSGK                        <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ density                        <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ density.incone                 <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ distance.ToD1                  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ distance.ToD2                  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ AttackersBehindBall            <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ DefendersBehindBall            <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ DefendersInCone                <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ InCone.GK                      <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ DefArea                        <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ distance.ToD1.360              <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ distance.ToD2.360              <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ milliseconds                   <dbl> 0, 0, 0, 0, 208, 875, 875, 358, 398, 39~
## $ ElapsedTime                    <dbl> 0.000, 0.000, 0.000, 0.000, 0.208, 1.87~
## $ StartOfPossession              <dbl> 0.000, 0.000, 0.000, 0.000, 0.208, 0.20~
## $ TimeInPoss                     <dbl> 0.000, 0.000, 0.000, 0.000, 0.000, 1.66~
## $ TimeToPossEnd                  <dbl> 0.000, 0.000, 0.000, 0.000, 22.763, 21.~

This dataset, with 157 variables and 3,165 observations, corresponds to the ‘Liv_v_Spurs_Event_Data.csv’ dataset stored in my Github repo, which I also use in some other blog posts.

Conor Buckley
Conor Buckley

My interests include data wrangling, using the R tidyverse, and making insightful charts.