Learn R Programming

⚠️There's a newer version (0.14.2) of this package.Take me there.

SwimmeR

SwimmeR is intended to assist those working with times from competitive pool swimming races, such as those conducted under the NHFS, NCAA, or FINA. For more information please see vignette("SwimmeR").

Latest Released Version from CRAN

install.packages("SwimmeR")

library(SwimmeR)

Latest Development Version from Github

devtools::install_github("gpilgrim2670/SwimmeR", build_vignettes = TRUE)

Usage

Version 0.6.0 of SwimmeR has two major uses - importing results and formatting times. It also has functions for course conversions and drawing brackets.

Importing Results

SwimmeR reads swimming results into R and outputs tidy dataframes of the results. SwimmeR uses read_results to read in either a PDF or HTML file (like a url) and the swim_parse or swim_parse_ISL function to convert the read file to a tidy dataframe. Reading .hy3 files is also now possible with swim_parse, although .hy3 functionality is still under development and quite buggy.

read_results has two arguments, file, which is the file path to read in, and node, required only for HTML files, this is a CSS node where the results reside. node defaults to "pre", which has been correct in every instance tested thus far.

swim_parse has seven arguments as of version 0.6.0.

file is the output of read_results and is required.

avoid is a list of strings. Rows in file containing any of those strings will not be included. avoid is optional. Incorrectly specifying it may lead to nonsense rows in the final dataframe, but will not cause an error. Nonsense rows can be removed after import.

typo and replacement work together to fix typos, by replacing them with replacements. Strings in typo will be replaced by strings in replacement in element index order - that is the first element of typo will be replaced everywhere it appears by the first element of replacement. Typos can cause lost data and nonsense rows.

See ?swim_parse or the package vignette for more information.

The following three arguments are only available in SwimmeR v0.6.0 and higher

splits and split_length tell swim_parse if and how to import split times. Setting splits = TRUE will import splits as columns. split_length refers to the pool course (length) as defaults to 50. It may also be set to 25, if splits are recorded every 25 rather than every 50. Split reporting within source files is very inconsistent, so while swim_parse will import whatever splits are present they may require some inspection after import. swim_parse_ISL also has a splits argument that works the same way. Set splits = TRUE to record splits. See the Splits sections of vignette("SwimmeR") for more information and examples.

relay_swimmers tells swim_parse or swim_parse_ISL whether or not to include the names of relay swimmers as additional columns. Set relay_swimmers = TRUE to include. There is more information available in vignette("SwimmeR")

swim_parse(
    read_results(
      "http://www.nyhsswim.com/Results/Boys/2008/NYS/Single.htm"
    ),
    typo = c("-1NORTH ROCKL"),
    replacement = c("1-NORTH ROCKL"),
    splits = TRUE, # requires version 0.6.0 or greater
    relay_swimmers = TRUE # requires version 0.6.0 or greater
  )

swim_parse_ISL only requires one argument, file, the output of read_results.

swim_parse_ISL(
    file = read_results(
      "https://isl.global/wp-content/uploads/2019/10/isl-indianapols-results-day-2-2.pdf"),
      splits = TRUE, # requires version 0.6.0 or greater
      relay_swimmers = TRUE # requires version 0.6.0 or greater
  )

SwimmeR can only read files in single column format, not double.

Will work - results in single column

Will also work - results in single column

Will not work - results in multiple columns

Formatting Times

SwimmeR also converts times between the conventional swimming format of minutes:seconds.hundredths (1:35.37) and the computationally useful format of seconds, reported to the 100ths place (e.g. 95.37). This is accomplished with sec_format and mmss_format, which are inverses of one another. Both sec_format and mmss_format work well with tidyverse functions.

times <- c("1:35.97", "57.34", "16:53.19", NA)
times_sec <- sec_format(times)
times_sec
times_mmss <- mmss_format(times_sec)
times_mmss
all.equal(times, times_mmss)

Regularizing team names

Team names are often abbreviated. Rather than specifying every abbreviation SwimmeR provides get_mode to make the task simpler.

name <- c(rep("Lilly King", 5), rep("James Sullivan", 3))
team <- c(rep("IU", 2), "Indiana", "IUWSD", "Indiana University", rep("Monsters University", 2), "MU")
df <- data.frame(name, team, stringsAsFactors = FALSE)
df %>% 
  group_by(name) %>% 
  mutate(Team = get_mode(team))

Drawing brackets

Brackets for single elimination tournaments can be produced for any number of teams between 5 and 64. Byes will automatically be included for higher seeds as required.

teams <- c("red", "orange", "yellow", "green", "blue", "indigo", "violet")
round_two <- c("red", "yellow", "blue", "indigo")
round_three <- c("red", "blue")
champion <- "red"
draw_bracket(teams = teams,
            round_two = round_two,
            round_three = round_three,
            champion = champion)

Course conversions

Additionally 'SwimmeR' also converts between the various pool sizes used in competitive swimming, namely 50m length (LCM), 25m length (SCM) and 25y length (SCY). This is accomplished with either convert_courses or convert_courses_DF, both of which have the same basic functionality. The difference is the convert_courses_DF returns a dataframe including the input variables whereas convet_courses only returns the converted time(s). Both functions will take inputs in either seconds or swimming format.

swim <- tibble(time = c("6:17.53", "59.14", "4:14.32", "16:43.19"), course = c("LCM", "LCM", "SCY", "SCM"), course_to = c("SCY", "SCY", "SCM", "LCM"), event = c("400 Free", "100 Fly", "400 IM", "1650 Free"))

course_convert(time = swim$time, course = swim$course, course_to = swim$course_to, event = swim$event)

course_convert_DF(time = swim$time, course = swim$course, course_to = swim$course_to, event = swim$event)

Getting help

I do a lot of demos on how to use SwimmeR at my blog Swimming + Data Science.

SwimmeR also has a vignette. Call vignette("SwimmeR"). If you download from github don't forget to set build_vignettes = TRUE.

If you find bug, please provide a minimal reproducible example at github.

Copy Link

Version

Install

install.packages('SwimmeR')

Monthly Downloads

339

Version

0.6.0

License

MIT + file LICENSE

Maintainer

Greg Pilgrim

Last Published

November 22nd, 2020

Functions in SwimmeR (0.6.0)

collect_relay_swimmers

Collects relay swimmers as a data frame within swim_parse
SwimmeR

SwimmeR: A package for working with swimming times
course_convert_DF

Course converter, returns dataframe
dive_place

Adds places to diving results
Swim_Parse

Formats swimming and diving data read with read_results into a dataframe
add_row_numbers

Add row numbers to raw results
discard_errors

Discards elements of list that have an error value from purrr::safely.
King200Breast

Results for Lilly King's 200 Breaststrokes
course_convert

Swimming Course Convertor
draw_bracket

Creates a bracket for tournaments involving 5 to 64 teams, single elimination
event_parse_ISL

Pulls out event labels from text
%>%

Pipe operator
Read_Results

Reads swimming and diving results into a list of strings in preparation for parsing with swim_parse
results_score

Scores a swim meet
%notin%

"Not in" function
fill_down

Fills NA values with previous non-NA value
get_mode

Find the mode (most commonly occurring) element of a list
interleave_results

Helper for reading interleaving prelims and finals results
is_link_broken

Determines if a link is valid
lines_sort

Sorts and collects lines by performance and row number
fill_left

Shifts non-NA values to left in dataframe
hy3_times

Helper for reading prelims and finals times from Hy-Tek .hy3 files
sec_format_helper

Helper function for formatting mm:ss.hh times as seconds
hy3_places

Helper for reading prelims and finals places from Hy-Tek .hy3 files
sec_format

Formatting mm:ss.tt times as seconds
splits_parse

Collects splits within swim_parse
splits_parse_ISL

Collects splits within swim_parse_ISL
mmss_format

Formatting seconds as mm:ss.hh
event_parse

Pulls out event labels from text
fold

Fold a vector onto itself
parse_hy3

Parses Hy-Tek .hy3 files
list_transform

Transform list of lists into dataframe
splits_reform

Adds together splits and compares to listed finals time to see if they match.
swim_parse_ISL

Formats swimming results from the International Swim League ('ISL') read with read_results into a data frame
tie_rescore

Rescore to account for ties
swim_place

Adds places to swimming results