This notebook uses #TidyTuesday week 37 Formula 1 Races data from ergast.com/mrd/db , and the new {gtExtras} package from Thomas Mock .
# Load Libraries
library(tidyverse)
library(gt)
#remotes::install_github("jthomasmock/gtExtras")
library(gtExtras)
# Suppress summarise info
options(dplyr.summarise.inform = FALSE)
# Import data
races <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-09-07/races.csv',show_col_types = FALSE)
driver_standings <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-09-07/driver_standings.csv',show_col_types = FALSE)
drivers <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-09-07/drivers.csv',show_col_types = FALSE)
results <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-09-07/results.csv',show_col_types = FALSE)
# Dataset of results by race, driver and season from https://github.com/rfordatascience/tidytuesday/blob/master/data/2021/2021-09-07/readme.md
driver_results_df <- driver_standings %>%
left_join(races, by = "raceId") %>%
rename(driver_url = url) %>%
left_join(drivers, by = "driverId")
# get top 10 drivers with most wins (position==1)
wins10 = drivers %>%
left_join(results, by = "driverId") %>%
left_join(races, by = "raceId") %>%
filter(position == "1") %>%
mutate(Driver = paste(forename, surname)) %>%
count(Driver, sort=T) %>% slice(1:10)
# Data preparation
d1 = driver_results_df %>%
mutate(Driver = paste(forename, surname)) %>%
select(Driver, year, wins, position, points) %>%
group_by(Driver,year) %>%
summarise(wins = sum(wins), points=sum(points)) %>%
filter(Driver %in% wins10$Driver) %>%
ungroup() %>%
mutate(wins_1 = ifelse(wins==0,0,1)) %>%
group_by(Driver) %>%
summarise(
Wins = length(wins_1[wins_1==1]),
Losses = length(wins_1[wins_1==0]),
Outcomes = list(wins_1), .groups = "drop",
Points= sum(points),
Spark = list(points),
) %>%
arrange(desc(Points))
d2 = d1 %>% left_join(wins10, by="Driver")
d3 = d2 %>% select(Driver,"Wins"=n, "Years with Wins" = Wins, "Years with Losses"=Losses,
Outcomes, Points, "Sparkline" = Spark) %>% arrange(desc(Wins))
d3
d3 %>%
gt() %>%
gt_plt_winloss(Outcomes) %>%
gt_kable_sparkline(Sparkline, height=45) %>%
gt_theme_espn() %>%
tab_header(title="Top 10 Formula 1 Drivers with the most wins") %>%
tab_source_note(source_note = "Data source: ergast.com/mrd/db") %>%
cols_align(
align = "center",
columns = c(Wins,`Years with Wins`,`Years with Losses`)) %>%
cols_width(`Years with Wins` ~px(90),
`Years with Losses` ~px(90),)
Driver
Wins
Years with Wins
Years with Losses
Outcomes
Points
Sparkline
Lewis Hamilton
99
15
0
40351.0
Michael Schumacher
91
15
4
14514.0
Sebastian Vettel
53
10
5
31307.0
Alain Prost
51
11
2
6829.5
Ayrton Senna
41
9
2
5531.0
Fernando Alonso
32
9
9
19231.0
Nigel Mansell
31
8
7
3928.0
Jackie Stewart
27
8
1
2574.0
Niki Lauda
25
8
5
3768.5
Jim Clark
25
7
2
1516.0
Data source: ergast.com/mrd/db
LS0tCnRpdGxlOiAiVGlkeSBUdWVzZGF5IFdlZWsgMzciCmRhdGU6ICIyMDIxLzA5LzExIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpUaGlzIG5vdGVib29rIHVzZXMgWyNUaWR5VHVlc2RheV0oaHR0cHM6Ly9naXRodWIuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheSkgd2VlayAzNyBbRm9ybXVsYSAxIFJhY2VzXShodHRwczovL2dpdGh1Yi5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L2Jsb2IvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTA5LTA3L3JlYWRtZS5tZCkgZGF0YSBmcm9tIFtlcmdhc3QuY29tL21yZC9kYl0oaHR0cHM6Ly9lcmdhc3QuY29tL21yZC9kYi8pLCBhbmQgdGhlIG5ldyBbe2d0RXh0cmFzfV0oaHR0cHM6Ly9qdGhvbWFzbW9jay5naXRodWIuaW8vZ3RFeHRyYXMvKSBwYWNrYWdlIGZyb20gW1Rob21hcyBNb2NrXShodHRwczovL3R3aXR0ZXIuY29tL3Rob21hc19tb2NrKS4KCgpgYGB7cn0KIyBMb2FkIExpYnJhcmllcyAKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZ3QpCiNyZW1vdGVzOjppbnN0YWxsX2dpdGh1YigianRob21hc21vY2svZ3RFeHRyYXMiKQpsaWJyYXJ5KGd0RXh0cmFzKQoKIyBTdXBwcmVzcyBzdW1tYXJpc2UgaW5mbwpvcHRpb25zKGRwbHlyLnN1bW1hcmlzZS5pbmZvcm0gPSBGQUxTRSkKYGBgCiAKYGBge3J9CiMgSW1wb3J0IGRhdGEKcmFjZXMgPC0gcmVhZHI6OnJlYWRfY3N2KCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L21hc3Rlci9kYXRhLzIwMjEvMjAyMS0wOS0wNy9yYWNlcy5jc3YnLHNob3dfY29sX3R5cGVzID0gRkFMU0UpCmRyaXZlcl9zdGFuZGluZ3MgPC0gcmVhZHI6OnJlYWRfY3N2KCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L21hc3Rlci9kYXRhLzIwMjEvMjAyMS0wOS0wNy9kcml2ZXJfc3RhbmRpbmdzLmNzdicsc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkKZHJpdmVycyA8LSByZWFkcjo6cmVhZF9jc3YoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTA5LTA3L2RyaXZlcnMuY3N2JyxzaG93X2NvbF90eXBlcyA9IEZBTFNFKQpyZXN1bHRzIDwtIHJlYWRyOjpyZWFkX2NzdignaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheS9tYXN0ZXIvZGF0YS8yMDIxLzIwMjEtMDktMDcvcmVzdWx0cy5jc3YnLHNob3dfY29sX3R5cGVzID0gRkFMU0UpCmBgYAoKYGBge3J9CiMgRGF0YXNldCBvZiByZXN1bHRzIGJ5IHJhY2UsIGRyaXZlciBhbmQgc2Vhc29uIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheS9ibG9iL21hc3Rlci9kYXRhLzIwMjEvMjAyMS0wOS0wNy9yZWFkbWUubWQKCmRyaXZlcl9yZXN1bHRzX2RmIDwtIGRyaXZlcl9zdGFuZGluZ3MgJT4lIAogIGxlZnRfam9pbihyYWNlcywgYnkgPSAicmFjZUlkIikgJT4lIAogIHJlbmFtZShkcml2ZXJfdXJsID0gdXJsKSAlPiUgCiAgbGVmdF9qb2luKGRyaXZlcnMsIGJ5ID0gImRyaXZlcklkIikgCmBgYAoKYGBge3J9CiMgZ2V0IHRvcCAxMCBkcml2ZXJzIHdpdGggbW9zdCB3aW5zIChwb3NpdGlvbj09MSkKd2luczEwID0gZHJpdmVycyAlPiUgCiAgbGVmdF9qb2luKHJlc3VsdHMsIGJ5ID0gImRyaXZlcklkIikgJT4lIAogIGxlZnRfam9pbihyYWNlcywgYnkgPSAicmFjZUlkIikgJT4lIAogIGZpbHRlcihwb3NpdGlvbiA9PSAiMSIpICU+JQogIG11dGF0ZShEcml2ZXIgPSBwYXN0ZShmb3JlbmFtZSwgc3VybmFtZSkpICU+JQogIGNvdW50KERyaXZlciwgc29ydD1UKSAlPiUgc2xpY2UoMToxMCkKYGBgCgpgYGB7cn0KIyBEYXRhIHByZXBhcmF0aW9uCmQxID0gZHJpdmVyX3Jlc3VsdHNfZGYgJT4lIAogIG11dGF0ZShEcml2ZXIgPSBwYXN0ZShmb3JlbmFtZSwgc3VybmFtZSkpICU+JQogIHNlbGVjdChEcml2ZXIsIHllYXIsIHdpbnMsIHBvc2l0aW9uLCBwb2ludHMpICU+JQogIGdyb3VwX2J5KERyaXZlcix5ZWFyKSAlPiUKICBzdW1tYXJpc2Uod2lucyA9IHN1bSh3aW5zKSwgcG9pbnRzPXN1bShwb2ludHMpKSAlPiUKICBmaWx0ZXIoRHJpdmVyICVpbiUgd2luczEwJERyaXZlcikgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZSh3aW5zXzEgPSBpZmVsc2Uod2lucz09MCwwLDEpKSAlPiUKICBncm91cF9ieShEcml2ZXIpICU+JQogIHN1bW1hcmlzZSgKICAgIFdpbnMgPSBsZW5ndGgod2luc18xW3dpbnNfMT09MV0pLAogICAgTG9zc2VzID0gbGVuZ3RoKHdpbnNfMVt3aW5zXzE9PTBdKSwKICAgIE91dGNvbWVzID0gbGlzdCh3aW5zXzEpLCAuZ3JvdXBzID0gImRyb3AiLAogICAgUG9pbnRzPSBzdW0ocG9pbnRzKSwKICAgIFNwYXJrID0gbGlzdChwb2ludHMpLAogICAgKSAlPiUKICBhcnJhbmdlKGRlc2MoUG9pbnRzKSkKCmQyID0gZDEgJT4lIGxlZnRfam9pbih3aW5zMTAsIGJ5PSJEcml2ZXIiKQpkMyA9IGQyICU+JSBzZWxlY3QoRHJpdmVyLCJXaW5zIj1uLCAiWWVhcnMgd2l0aCBXaW5zIiA9IFdpbnMsICJZZWFycyB3aXRoIExvc3NlcyI9TG9zc2VzLAogICAgICAgICAgICAgICAgICAgT3V0Y29tZXMsIFBvaW50cywgIlNwYXJrbGluZSIgPSBTcGFyaykgJT4lIGFycmFuZ2UoZGVzYyhXaW5zKSkKCmQzCmBgYAoKYGBge3J9CmQzICU+JQogIGd0KCkgJT4lCiAgZ3RfcGx0X3dpbmxvc3MoT3V0Y29tZXMpICU+JQogIGd0X2thYmxlX3NwYXJrbGluZShTcGFya2xpbmUsIGhlaWdodD00NSkgJT4lCiAgZ3RfdGhlbWVfZXNwbigpICU+JQogIHRhYl9oZWFkZXIodGl0bGU9IlRvcCAxMCBGb3JtdWxhIDEgRHJpdmVycyB3aXRoIHRoZSBtb3N0IHdpbnMiKSAlPiUKICB0YWJfc291cmNlX25vdGUoc291cmNlX25vdGUgPSAiRGF0YSBzb3VyY2U6IGVyZ2FzdC5jb20vbXJkL2RiIikgJT4lCiAgY29sc19hbGlnbigKICBhbGlnbiA9ICJjZW50ZXIiLAogIGNvbHVtbnMgPSBjKFdpbnMsYFllYXJzIHdpdGggV2luc2AsYFllYXJzIHdpdGggTG9zc2VzYCkpICU+JQogIGNvbHNfd2lkdGgoYFllYXJzIHdpdGggV2luc2AgfnB4KDkwKSwKICAgICAgICAgICAgIGBZZWFycyB3aXRoIExvc3Nlc2AgfnB4KDkwKSwpCmBgYAoKCgoKCg==