r - 迭代地将值附加到由循环创建的数据框中的所有记录
问题描述
试图从basketball-reference.com(正在工作)中抓取球员职业生涯的个人比赛统计数据,但我想将球员姓名添加到与个人比赛结果相对应的结果df中。例如,第一个循环将只重复“Kareem Abdul-Jabbar”86 次,以获取由抓取生成的 86 行。我正在尝试使用 cbind 填充方法将下一个循环添加到名为“Player_Name”的现有列中,但 cbind 会为每个循环创建一个新列。任何关于如何将球员姓名放入单个列的建议将不胜感激。
library(rvest)
library(dplyr)
# Create df of players to be scraped
#########################################################################
players = data.frame(player_name = c(rep("Kareem Abdul-Jabbar",each=20),
rep("Karl Malone",each=19)),
player_id = c(rep("abdulka01",each=20),
rep("malonka01",each=19)),
initial = c(rep("a",each=20),
rep("m",each=19)),
year = c(seq(1970,1989,by=1),
seq(1986,2004,by=1)))
# Scrape data and stack in a df
#########################################################################
output <- data_frame()
for (i in 1:2){
url <- paste0("https://www.basketball-reference.com/players/",
players[i,3],"/",players[i,2],"/gamelog/",players[i,4])
webpage <- read_html(url)
temp <- webpage %>%
html_nodes("#pgl_basic") %>%
html_table()
player_name=players[i,1]
output <- cbind(bind_rows(output, temp),player_name)
}
解决方案
您可以创建 URL 来抓取并使用map_df
它们将它们组合到一个数据帧中。
library(rvest)
library(tidyverse)
urls <- sprintf("https://www.basketball-reference.com/players/%s/%s/gamelog/%s",
players$initial, players$player_id, players$year)
result <- map_df(urls, ~.x %>%
read_html() %>%
html_nodes("#pgl_basic") %>%
html_table(), .id = 'playername') %>%
mutate(playername = players$player_name[as.numeric(playername)])
推荐阅读
- flutter - 在同一页面中使用两个 BLoC 并在第二个 BLoC 中传递第一个 BLoC 的状态
- java - 如何从服务器向客户端发送大量数据集
- javascript - 在 react-select 组件中隐藏旋转按钮
- spring - AWS SQS 消费者不消费消息
- python - 使用lxml Python同时为单个对象检索多个嵌套语句
- c - C 代码在假定运行 scanf 行时停止
- javascript - Leaflet - 避免在 javascript 中重叠标签的方法
- google-cloud-platform - GCP:资源名称与 URL:不一致的匹配
- java - Sonarqube 抱怨 for 循环中未使用的变量
- java - 如果我从“清洁架构”一书中实现架构,谁必须使用包修饰符创建服务