R/player_game_logs.R

#' @title Scrape Game Logs For Specified Year, Players
#' @param players a vector of player names
#' @param years vector of years corresponding to player names
#' @description Gets Player Game Logs
#' @keywords NBA basketball-reference
#' @importFrom magrittr %>%
#' @export
#' @examples
#' player_game_logs(c("Stephen Curry", "Steven Adams"), c(2017,2018))
# will return Curry's game logs for 2017, Adams's game logs for 2018

player_game_logs <- function(players, years) {

  input_df <- data.frame(player_name=tolower(players), year=years, stringsAsFactors = FALSE)

  #base url
  base_url <- 'https://www.basketball-reference.com/'

  #load data frame with player names and urls
  player_df <- readr::read_csv("https://raw.githubusercontent.com/emilykuehler/basketballstatsR/master/data-raw/player_card.csv") %>%
    dplyr::mutate(player_name = tolower(player_name)) %>%
    dplyr::select(player_name, init_season, final_season, links) %>%
    subset(player_name %in% input_df$player_name) %>%
    dplyr::mutate(links = strsplit(links,".html")) %>%
    dplyr::mutate(links = substr(links, 2, nchar(links))) %>%
    dplyr::full_join(input_df, by=c("player_name")) %>%
    dplyr::mutate(year = ifelse(year >= init_season & year <= final_season, year, NA)) %>%
    subset(!is.na(year)) %>%

    #get links for game logs
    dplyr::mutate(links = strsplit(links,".html")) %>%
    dplyr::mutate(links = paste0(base_url, links, "/gamelog/", year))


  #check to see if user has input any names that aren't in database
  player_vec <- tolower(players)

  bad_names <- player_vec[!player_vec %in% player_df$player_name]

  #give user msg if they messed up
  if(length(bad_names > 0)) {
    print("Several player names were either mistyped or not in the database.")
    print("No data will be collected for:")
    print(bad_names)
  }

  df_list <- list()

  # grab tables using URLs and store in list
  for (row_num in 1:nrow(player_df)) {

    url <- player_df$links[row_num]
    print (url)
    year <- player_df$year[row_num]
    name <- paste0(player_df$player_name[row_num], year)
    df <- url2playergamelogs(url, player_df$player_name[row_num], year)
    df <- clean_game_logs(df, year)
    df_list[[name]] <- df

  }

  return (df_list)
}
emilykuehler/basketballstatsR documentation built on May 31, 2019, 10:01 a.m.