首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从多个链接创建一个for循环以创建一个表,在多个季节/年中使用ESPN链接

从多个链接创建一个for循环以创建一个表,在多个季节/年中使用ESPN链接
EN

Stack Overflow用户
提问于 2018-07-14 00:44:47
回答 1查看 73关注 0票数 0

我有以下链接,成功地刮过,我想创建一个for循环。我正在抓取的表分布在3页上,因此whip_2018awhip_2018bwhip_2018c链接向量:

代码语言:javascript
复制
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"

这些链接是2018年的季节,但我有链接可以追溯到2005年。如何将以下代码转换为将考虑多个页面链接和多年/季节的for 循环?

代码语言:javascript
复制
# 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年的链接在这里(大多数季节至少有两三个链接):

代码语言:javascript
复制
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")

鞭是一个MLB统计量,因此我的向量名称。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-14 01:22:35

考虑在定义的函数中泛化您的流程,并传递一个年份参数。循环遍历函数,将年数向量传递到lapply中,以便将数据序列列表与do.call(rbind, ...)bind_rows连接在一起。

代码语言:javascript
复制
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按元素迭代。

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51334304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档