从多个链接创建一个 for 循环以创建一个 table,使用 ESPN 链接创建多个 seasons/years
Creating a for loop from multiple links to create one table, using ESPN links for multiple seasons/years
我有以下 link 已成功抓取,我想创建一个 for
循环。我正在抓取的 table 分布在 3 页上,因此 whip_2018a
、whip_2018b
和 whip_2018c
link 向量:
library(tidyverse)
library(rvest)
whip_2018a <- "http://www.espn.com/mlb/stats/pitching/_/order/false"
whip_2018b <- "http://www.espn.com/mlb/stats/pitching/_/count/41/qualified/true/order/false"
whip_2018c <- "http://www.espn.com/mlb/stats/pitching/_/count/81/qualified/true/order/false"
这些 link 是 2018 赛季,但我有 link 可以追溯到 2005 年。如何将以下代码变成 for
将考虑多个页面 link 和多个 years/seasons?
的循环
# Scraping 2018 tables - there are multiple pages to the list
a2018 <- whip_2018a %>%
read_html %>%
html_node("#my-players-table > div > div.mod-content > table") %>%
html_table(header = T)
b2018 <- whip_2018b %>%
read_html %>%
html_node("#my-players-table > div > div.mod-content > table") %>%
html_table(header = T)
c2018 <- whip_2018c %>%
read_html %>%
html_node("#my-players-table > div > div.mod-content > table") %>%
html_table(header = T)
# This creates the table for the 2018 season
whip_2018 <- rbind(a2018, b2018, c2018)
我知道这是否不可能,但我的直觉告诉我,一些适当的 [i]
可以使这项工作成功。作为参考,2017 年 link 在这里(大多数季节至少有两到三个 link):
whip_2017a <- "http://www.espn.com/mlb/stats/pitching/_/year/2017/order/false"
whip_2017b <- "http://www.espn.com/mlb/stats/pitching/_/year/2017/count/41/qualified/true/order/false")
WHIP 是一个 MLB 统计数据,因此是我的向量名称。
考虑在定义的函数中概括您的流程并传入年份参数。并通过函数将年向量传递到 lapply
中,以获得要在末尾与 do.call(rbind, ...)
或 bind_rows
.
连接的数据帧列表
get_whip_data <- function(yr_param) {
# ASSIGN URLS
whip_a <- paste0("http://www.espn.com/mlb/stats/pitching/_/year/", yr_param, "/order/false")
whip_b <- paste0("http://www.espn.com/mlb/stats/pitching/_/year/", yr_param, "/count/41/qualified/true/order/false")
whip_c <- paste0("http://www.espn.com/mlb/stats/pitching/_/year/", yr_param, "/count/81/order/false")
# BUILD DATA FRAMES
a_data <- whip_a %>%
read_html %>%
html_node("#my-players-table > div > div.mod-content > table") %>%
html_table(header = T)
b_data <- whip_b %>%
read_html %>%
html_node("#my-players-table > div > div.mod-content > table") %>%
html_table(header = T)
c_data <- whip_c %>%
read_html %>%
html_node("#my-players-table > div > div.mod-content > table") %>%
html_table(header = T)
# APPEND ALL
yr_df <- rbind(a_data, b_data, c_data) # OR do.call(rbind, list(a_data, b_data, c_data))
yr_df$year <- yr_param
return(yr_df)
}
df_list <- lapply(2005:2017, get_whip_data)
final_df <- do.call(rbind, df_list) # REQUIRES SAME COLUMNS ACROSS YEARS
final_df <- dplyr::bind_rows(df_list) # USE IF COLUMNS MAY DIFFER ACROSS YEARS
如果您有可用的硬编码链接,请使用 Map
传递它们(mapply
的包装器)。这假设所有参数的长度都相等,其中 Map
按元素迭代。
get_whip_data <- function(yr_param, whip_a, whip_b, whip_c) {
# BUILD DATA FRAMES
a_data <- whip_a %>%
read_html %>%
html_node("#my-players-table > div > div.mod-content > table") %>%
html_table(header = T)
b_data <- whip_b %>%
read_html %>%
html_node("#my-players-table > div > div.mod-content > table") %>%
html_table(header = T)
c_data <- whip_c %>%
read_html %>%
html_node("#my-players-table > div > div.mod-content > table") %>%
html_table(header = T)
# APPEND ALL
yr_df <- rbind(a_data, b_data, c_data)
yr_df$year <- yr_param
return(yr_df)
}
df_list <- Map(get_whip_data, years_vec, a_urls_vec, b_urls_vec, c_urls_vec)
final_df <- do.call(rbind, df_list) # REQUIRES SAME COLUMNS ACROSS YEARS
final_df <- dplyr::bind_rows(df_list) # USE IF COLUMNS MAY DIFFER ACROSS YEARS
我有以下 link 已成功抓取,我想创建一个 for
循环。我正在抓取的 table 分布在 3 页上,因此 whip_2018a
、whip_2018b
和 whip_2018c
link 向量:
library(tidyverse)
library(rvest)
whip_2018a <- "http://www.espn.com/mlb/stats/pitching/_/order/false"
whip_2018b <- "http://www.espn.com/mlb/stats/pitching/_/count/41/qualified/true/order/false"
whip_2018c <- "http://www.espn.com/mlb/stats/pitching/_/count/81/qualified/true/order/false"
这些 link 是 2018 赛季,但我有 link 可以追溯到 2005 年。如何将以下代码变成 for
将考虑多个页面 link 和多个 years/seasons?
# Scraping 2018 tables - there are multiple pages to the list
a2018 <- whip_2018a %>%
read_html %>%
html_node("#my-players-table > div > div.mod-content > table") %>%
html_table(header = T)
b2018 <- whip_2018b %>%
read_html %>%
html_node("#my-players-table > div > div.mod-content > table") %>%
html_table(header = T)
c2018 <- whip_2018c %>%
read_html %>%
html_node("#my-players-table > div > div.mod-content > table") %>%
html_table(header = T)
# This creates the table for the 2018 season
whip_2018 <- rbind(a2018, b2018, c2018)
我知道这是否不可能,但我的直觉告诉我,一些适当的 [i]
可以使这项工作成功。作为参考,2017 年 link 在这里(大多数季节至少有两到三个 link):
whip_2017a <- "http://www.espn.com/mlb/stats/pitching/_/year/2017/order/false"
whip_2017b <- "http://www.espn.com/mlb/stats/pitching/_/year/2017/count/41/qualified/true/order/false")
WHIP 是一个 MLB 统计数据,因此是我的向量名称。
考虑在定义的函数中概括您的流程并传入年份参数。并通过函数将年向量传递到 lapply
中,以获得要在末尾与 do.call(rbind, ...)
或 bind_rows
.
get_whip_data <- function(yr_param) {
# ASSIGN URLS
whip_a <- paste0("http://www.espn.com/mlb/stats/pitching/_/year/", yr_param, "/order/false")
whip_b <- paste0("http://www.espn.com/mlb/stats/pitching/_/year/", yr_param, "/count/41/qualified/true/order/false")
whip_c <- paste0("http://www.espn.com/mlb/stats/pitching/_/year/", yr_param, "/count/81/order/false")
# BUILD DATA FRAMES
a_data <- whip_a %>%
read_html %>%
html_node("#my-players-table > div > div.mod-content > table") %>%
html_table(header = T)
b_data <- whip_b %>%
read_html %>%
html_node("#my-players-table > div > div.mod-content > table") %>%
html_table(header = T)
c_data <- whip_c %>%
read_html %>%
html_node("#my-players-table > div > div.mod-content > table") %>%
html_table(header = T)
# APPEND ALL
yr_df <- rbind(a_data, b_data, c_data) # OR do.call(rbind, list(a_data, b_data, c_data))
yr_df$year <- yr_param
return(yr_df)
}
df_list <- lapply(2005:2017, get_whip_data)
final_df <- do.call(rbind, df_list) # REQUIRES SAME COLUMNS ACROSS YEARS
final_df <- dplyr::bind_rows(df_list) # USE IF COLUMNS MAY DIFFER ACROSS YEARS
如果您有可用的硬编码链接,请使用 Map
传递它们(mapply
的包装器)。这假设所有参数的长度都相等,其中 Map
按元素迭代。
get_whip_data <- function(yr_param, whip_a, whip_b, whip_c) {
# BUILD DATA FRAMES
a_data <- whip_a %>%
read_html %>%
html_node("#my-players-table > div > div.mod-content > table") %>%
html_table(header = T)
b_data <- whip_b %>%
read_html %>%
html_node("#my-players-table > div > div.mod-content > table") %>%
html_table(header = T)
c_data <- whip_c %>%
read_html %>%
html_node("#my-players-table > div > div.mod-content > table") %>%
html_table(header = T)
# APPEND ALL
yr_df <- rbind(a_data, b_data, c_data)
yr_df$year <- yr_param
return(yr_df)
}
df_list <- Map(get_whip_data, years_vec, a_urls_vec, b_urls_vec, c_urls_vec)
final_df <- do.call(rbind, df_list) # REQUIRES SAME COLUMNS ACROSS YEARS
final_df <- dplyr::bind_rows(df_list) # USE IF COLUMNS MAY DIFFER ACROSS YEARS