プロ野球データFreakさんのサイトから,スクレイピングで野球選手に関するデータを取ってくるコードです。 野球選手の年俸や身長,体重,安打数などは,対数正規分布,正規分布,ポアソン分布など様々な分布に従うと考えられますし,12球団ありますから,一般化線形モデルや階層線形モデルのサンプルデータにもってこいです。

# パッケージの読みこみ
library(tidyverse)
library(rvest)
library(summarytools)

# アドレスの格納
## プレイヤーデータ
address1 <- "https://baseball-data.com/player/"
## 打者/投手成績
address2 <- "https://baseball-data.com/stats/"
## チームID
tID <- c("c", "t", "yb", "g", "d", "s", "h", "l", "e", "bs", "f", "m")

# スクレイピング
## 空のデータフレームを用意
dat1 <- data.frame()
dat2 <- data.frame()
dat3 <- data.frame()
## チームごとに取っていく
for (i in 1:NROW(tID)) {
  # プレイヤーデータ
  url1 <- paste0(address1, tID[i], "/")
  tmp.dat <- read_html(url1) %>%
    html_table() %>%
    as.data.frame()
  tmp.dat$team <- tID[i]
  dat1 <- rbind(dat1, tmp.dat)
  # 打者成績
  url2 <- paste0(address2, "hitter-", tID[i], "/")
  tmp.dat <- read_html(url2) %>%
    html_table() %>%
    as.data.frame() %>%
    slice(1:(n() - 1))
  tmp.dat$team <- tID[i]
  dat2 <- rbind(dat2, tmp.dat)
  # 投手成績
  url3 <- paste0(address2, "pitcher-", tID[i], "/")
  tmp.dat <- read_html(url3) %>%
    html_table() %>%
    as.data.frame() %>%
    slice(1:(n() - 1))
  tmp.dat$team <- tID[i]
  dat3 <- rbind(dat3, tmp.dat)
}


# プレイヤーデータ整形 ----------------------------------------------------------------------

dat1 %>%
  as_tibble() %>%
  transmute(
    Name = .$選手名,
    team = as.factor(.$team),
    salary = str_replace(.$年俸.推定., "万円", "") %>% str_replace(",", "") %>% as.numeric(),
    position = .$守備,
    years = str_replace(.$年数, "年", "") %>% as.numeric(),
    height = str_replace(.$身長, "cm", "") %>% as.numeric(),
    weight = str_replace(.$体重, "kg", "") %>% as.numeric(),
    bloodType = as.factor(.$血液型),
    throw.by = str_sub(.$投打, start = 1, end = 1) %>% as.factor(),
    batting.by = str_sub(.$投打, start = 2, end = 2) %>% as.factor(),
    birth.place = .$出身地,
    birth.day = as.Date(.$生年月日)
  ) -> dat1

# 野手データ整形 ----------------------------------------------------------------------

dat2 %>%
  as_tibble() %>%
  mutate_at(c(3:20), funs(as.numeric(.))) %>%
  mutate(team = as.factor(team)) -> dat2

# 投手データ整形 ----------------------------------------------------------------------

dat3 %>%
  as_tibble() %>%
  mutate_at(c(3:20), funs(as.numeric(.))) %>%
  mutate(team = as.factor(team)) -> dat3

# 統合 ----------------------------------------------------------------------


dat1 %>%
  full_join(., full_join(dat2, dat3, by = c("選手名", "team", "試合", "背番号")),
    by = c("Name" = "選手名", "team")
  ) %>%
  mutate(
    "Name" = as.factor(Name),
    "team" = as.factor(team),
    "position" = as.factor(position),
    "birth.place" = as.factor(birth.place)
  ) %>%
  mutate(team = fct_recode(team,
    "Tigers" = "t", "Carp" = "c", "Giants" = "g", "DeNA" = "yb",
    "Dragons" = "d", "Swallows" = "s", "Softbank" = "h", "Lions" = "l",
    "Eagles" = "e", "Orix" = "bs", "Fighters" = "f", "Lotte" = "m"
  )) %>%
  rename(
    セーブ = セlブ,
    ホールド = ホlルド
  ) %>%
  # 基本情報がない選手は削除
  filter(!is.na(salary)) %>%
  rename(
    Num = 背番号,
    Games = 試合,
    AtBats = 打数,
    Hit = 安打,
    HR = 本塁打,
    Win = 勝利,
    Lose = 敗北,
    Save = セーブ,
    Hold = ホールド
  ) %>%
  # 使いやすい変数だけセレクト。全体的にはもっといっぱいあります。
  dplyr::select(
    Name, team, salary, bloodType, Games,AtBats,
    position, height, weight,
    Hit, HR, Win, Lose, Save, Hold
  ) -> baseball

出来上がりはこんな形です。

library(DT)
datatable(baseball)

最後はCSV形式で保存などすればいいでしょう。

write_csv(baseball, file = "baseball.csv")