R 迭代地将值附加到由循环创建的数据帧中的所有记录

R 迭代地将值附加到由循环创建的数据帧中的所有记录,r,web-scraping,rvest,R,Web Scraping,Rvest,尝试从basketball-reference.com(正在运行)中获取球员职业生涯中的个人比赛统计数据,但我想将球员姓名添加到与个人比赛结果相对应的结果df中。例如,第一个循环将对scrape生成的86行重复“Kareem Abdul Jabbar”86次。我试图使用cbind fill方法将下一个循环添加到名为“Player_Name”的现有列中,但是cbind正在为每个循环创建一个新列。任何关于如何将球员姓名纳入一列的建议都将不胜感激 library(rvest) library(dply

尝试从basketball-reference.com(正在运行)中获取球员职业生涯中的个人比赛统计数据,但我想将球员姓名添加到与个人比赛结果相对应的结果df中。例如,第一个循环将对scrape生成的86行重复“Kareem Abdul Jabbar”86次。我试图使用cbind fill方法将下一个循环添加到名为“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)
}
库(rvest)
图书馆(dplyr)
#创建要刮除的玩家的df
#########################################################################
players=data.frame(player_name=c(rep(“Kareem Abdul Jabbar”),每个=20),
代表(“卡尔·马龙”,各=19)),
玩家id=c(代表(“阿卜杜勒卡01”,每个=20),
代表(“malonka01”,每个=19)),
初始值=c(代表(“a”),每个=20),
代表(“m”,各=19)),
年份=c(序号19701989,by=1),
seq(19862004,by=1)))
#在df中刮取数据并进行堆栈
#########################################################################

输出我不确定您想要的最终表单是什么样子,但是您可以尝试更改代码的最后一部分

 output <- cbind(bind_rows(output, temp),player_name)

output有一种更简洁的方法可以通过函数式编程解决这个问题。首先,我们在tibbles中设置参数

library(tidyverse)
library(glue)

kareem <- tibble(
  player_name = 'Kareem Abdul-Jabbar',
  player_id = 'abdulka01',
  initial = 'a',
  year = 1970:1989)

karl <- tibble(
  player_name = 'Karl Malone',
  player_id = 'malonka01',
  initial = 'm',
  year = 1986:2004)

您可以创建URL进行刮取,并使用
map\u 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)])
库(rvest)
图书馆(tidyverse)
URL%
html#U节点(“pgl#U基本”)%>%
html_table(),.id='playername')%>%
变异(playername=players$player\u name[as.numeric(playername)])

非常感谢查看
purrr
的备忘单。感谢@Pedro,好信息,感谢更干净的tibble方法。非常感谢Ronak,我将此与@Pedro的tibble解决方案结合使用,以获得我需要的。我现在注意到,对于某些玩家,生成的html_表中有些是字符/整数的混合,有些只是字符。是否有办法强制刮取的数据为所有字符类型?我有map\u at或map\u chr,但两者似乎都与输入df有关,而不是结果数据。在
html\u table()
之后,您可以添加
%%>%mutate\u all(as.character)
,这将强制所有列都是character类型。我尝试过这一点,也尝试过一些sapply版本,但是,当您在Michael Jordan中循环时,似乎仍然存在数据类型问题(jordami01,j,1985:2003)。即使使用as.character mutate,1985年的DF也可以作为所有字符使用,1986年的DF可以作为char/int的混合使用。您可以使用面临问题的特定链接提出新问题。
bind_rows(kareem, karl) %>%
  mutate(
    url = pmap_chr( # iterate over multiple variables and return a character vctr
      list(initial, player_id, year), # choose these variables
      function(initial, player_id, year) { # and apply this function
        
        base <- "https://www.basketball-reference.com/players"
        
        glue('{base}/{initial}/{player_id}/gamelog/{year}')  # returns the url
        
      }),
    webpage = map(url, read_html), # iterate over urls and apply read_html
    temp = map(
      webpage,  # iterate over webpage
      ~ html_nodes(.x, "#pgl_basic") %>% # and apply this function
        html_table())
    ) -> # assign to a new tibble
scrapped_data 


square <- function(v) {v^2}

map_dbl(1:4, ~ .x^2)
map_dbl(1:4, function(.x) .x^2)
map_dbl(1:4, square)
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)])