sabr - R package (GitHub)
Connect to the Lahman SQL Database to query and calculate MLB offensive performance statistics

The sabr package connects the Lahman SQL Database with functions used in calculating offensive performance in the MLB, namely wOBA. Created by Tom Tango and popularized in The Book: Playing the Percentages in Baseball, wOBA uses yearly MLB performance to weigh offensive measures relative to league value. This package offers the following capabilities:
- Retrieves the most up-to-date wOBA measures from 1871-2015
- Queries yearly and career offensive performance from the Lahman SQL database
- Calculates a playerâs seasonal wOBA performance
Installation:
Download the latest development version from github:
if (packageVersion("devtools") < 1.6) {
install.packages("devtools")
}
devtools::install_github("mdlee12/sabr")
Motivation:
wOBA is one of the best catch-all offensive performance statistics, but itâs formula is a bit convoluted since it requires 1) ten distinct rate stats and 2) weighted values based on a seasonâs run environment.
For example, the wOBA formula for the 2013 season was:
wOBA = (0.690 * uBB + 0.722 * HBP + 0.888 * (H - DB - TR - HR) + 1.271 * DB + 1.616 * TR + 2.101 * HR) / (AB + BB - IBB + SF + HBP)
Check out Fangraphsâ library for additional details.
New Functions with 0.2:
- wRAA_season : Returns a MLB playerâs weighted Runs Above Average by yearID
library(sabr)
wRAA_season("braunry02","2015")
## [1] 23.89798
- wRC_season : Returns a MLB playerâs weighted Runs Created by yearID
wRC_season("molitpa01","1991")
## [1] 127.0164
- wRCp_season : Returns a MLB playerâs weighted Runs Created Plus by yearID
wRCp_season("yountro01","1989")
## [1] 152.5421
Full calculation details are in the wOBA and wRC+ calculation.Rmd file
wRCp_season makes a couple assumptions:
- Park Factors are pulled from the Lahman Database - these are different from other sources
- A playerâs primary position is used to remove pitchers from the League Runs/Plate Appearance calculation
Key Functions from 0.1:
- battingseason : Offensive seasonal performance by playerID and yearID
battingseason("parrage01","2014")
## playerID yearID stints teamID AB R H DB TR HR RBI SB CS BB SO IBB SF SH GIDP HBP
## 1 parrage01 2014 2 ARI,MIL 529 64 138 22 4 9 40 9 7 32 100 5 2 6 10 5
- battingcareer : Offensive career performance by playerID by organized by season
battingcareer("fieldpr01")
## playerID yearID stints teamID AB R H DB TR HR RBI SB CS BB SO IBB SF SH GIDP HBP
## 1 fieldpr01 2005 1 MIL 59 2 17 4 0 2 10 0 0 2 17 0 1 0 0 0
## 2 fieldpr01 2006 1 MIL 569 82 154 35 1 28 81 7 2 59 125 5 8 0 17 12
## 3 fieldpr01 2007 1 MIL 573 109 165 35 2 50 119 2 2 90 121 21 4 0 9 14
## 4 fieldpr01 2008 1 MIL 588 86 162 30 2 34 102 3 2 84 134 19 10 0 12 12
## 5 fieldpr01 2009 1 MIL 591 103 177 35 3 46 141 2 3 110 138 21 9 0 14 9
## 6 fieldpr01 2010 1 MIL 578 94 151 25 0 32 83 1 0 114 138 17 1 0 12 21
## 7 fieldpr01 2011 1 MIL 569 95 170 36 1 38 120 1 1 107 106 32 6 0 17 10
## 8 fieldpr01 2012 1 DET 581 83 182 33 1 30 108 1 0 85 84 18 7 0 19 17
## 9 fieldpr01 2013 1 DET 624 82 174 36 0 25 106 1 1 75 117 5 4 0 20 9
## 10 fieldpr01 2014 1 TEX 150 19 37 8 0 3 16 0 0 25 24 11 1 0 5 2
## 11 fieldpr01 2015 1 TEX 613 78 187 28 0 23 98 0 0 64 88 14 5 0 21 11
- woba_season : Returns a MLB playerâs weighted On-Base Average by yearID
woba_season("fieldpr01","2014")
## [1] 0.3049516
- lahman_search : Returns a playerâs Lahman playerID using either:
- nameFirst (Player First Name)
- nameLast (Player Last Name)
- nameGiven (Player Given Name)
- retroID (Retrosheet ID)
- bbrefID (Baseball Reference ID)
lahman_search(nameFirst = "Robin")
## playerID nameFirst nameLast nameGiven retroID bbrefID
## 1 jenniro01 Robin Jennings Robin Christopher jennr001 jenniro01
## 2 roberro01 Robin Roberts Robin Evan rober102 roberro01
## 3 venturo01 Robin Ventura Robin Mark ventr001 venturo01
## 4 yountro01 Robin Yount Robin R. younr001 yountro01
lahman_search(nameLast = "Fielder")
## playerID nameFirst nameLast nameGiven retroID bbrefID
## 1 fieldce01 Cecil Fielder Cecil Grant fielc001 fieldce01
## 2 fieldpr01 Prince Fielder Prince Semien fielp001 fieldpr01
lahman_search(nameGiven = "Russell Oles")
## playerID nameFirst nameLast nameGiven retroID bbrefID
## 1 branyru01 Russell Branyan Russell Oles branr001 branyru01
lahman_search(retroID = "molip001")
## playerID nameFirst nameLast nameGiven retroID bbrefID
## 1 molitpa01 Paul Molitor Paul Leo molip001 molitpa01
lahman_search(bbrefID = "yostne01")
## playerID nameFirst nameLast nameGiven retroID bbrefID
## 1 yostne01 Ned Yost Edgar Frederick yoste001 yostne01
Have a question, issue or suggestion? Create a pull request, file an issue, or feel free to contact me on Twitter