在与来自 map_df 循环的其他表格堆叠之前,将 HTML_tables 转换为字符

Convert HTML_tables to character before stacking with other tables from a map_df loop

试图从篮球中逐年抓取个人比赛数据-reference.com 迈克尔·乔丹,但他打球的某些年份仅作为角色出现,有些则是 char/integer 的混合体,这会导致 map_df 过程失败。我尝试将 'mutate_all(as.character)' 添加到我的代码中,但我认为这是在数据已经被 map_df 循环后尝试将数据转换为 char。在堆叠结果之前,我需要一种方法将每个单独的迭代转换为 char。我可以在数字堆叠后将它们转换为 int 格式。任何见解表示赞赏。

library(tidyverse)

# Create tibbles for each player
#########################################################################

jordan <- tibble(
  player_name = 'Michael Jordan',
  player_id = 'jordami01',
  initial = 'j',
  year = 1985:2003)

# Create df of players to be scraped
#########################################################################

players = bind_rows(jordan)

urls <- sprintf("https://www.basketball-reference.com/players/%s/%s/gamelog/%s", 
                players$initial, players$player_id, players$year)

# output[] <- lapply(output, as.character)
output <- purrr::map_df(urls, ~.x %>% 
                  read_html() %>%
                  html_nodes("#pgl_basic") %>% 
                  html_table() %>%
                  mutate_all(as.character))                  

将这些数据合并到一个数据框中会很复杂。

  1. 并非所有网址 return table。
  2. table 中有重复的列名(R 不喜欢这样)
  3. 还有没有名字的列(R 也不喜欢那样)

我已将列名称重命名为 col1col2 等以避免问题 2 和 3。

library(tidyverse)
library(rvest)
  
map_df(urls, ~{
            .x %>% 
               read_html() %>%
              html_nodes("#pgl_basic") %>% 
              html_table() -> tmp
  if(length(tmp)) {
    tmp <- tmp[[1]]
    setNames(tmp, paste0('col', seq_along(tmp))) %>%
      mutate(across(.fns = as.character))
    }
  else NULL
}) -> result