在与来自 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))
将这些数据合并到一个数据框中会很复杂。
- 并非所有网址 return table。
- table 中有重复的列名(R 不喜欢这样)
- 还有没有名字的列(R 也不喜欢那样)
我已将列名称重命名为 col1
、col2
等以避免问题 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
试图从篮球中逐年抓取个人比赛数据-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))
将这些数据合并到一个数据框中会很复杂。
- 并非所有网址 return table。
- table 中有重复的列名(R 不喜欢这样)
- 还有没有名字的列(R 也不喜欢那样)
我已将列名称重命名为 col1
、col2
等以避免问题 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