Я бы подошел к этому иначе.Во-первых, я бы сохранял имена и идентификаторы игроков в списке или во фрейме данных.Например:
player_id <- data.frame(player = c("Howard", "Lehner", "Binnington"),
id = c(8470657, 8475215, 8476412),
stringsAsFactors = FALSE)
player id
1 Howard 8470657
2 Lehner 8475215
3 Binnington 8476412
Далее я бы написал функцию, которая принимает player
и id
и возвращает фрейм данных с веб-сайта с добавленным столбцом имени игрока.
Моя функция использует библиотеку rvest
, которая поставляет read_html
и html_table
вместо XML
.Есть сложность: пропущенные значения представлены -
, что превращает столбец в символы.Но не все игроки имеют пропущенные значения, поэтому эти столбцы являются числовыми.Таким образом, функция меняет -
на NA
, а затем преобразует все значения в числовые, прежде чем объединять игроков.Библиотека dplyr
предоставляет функции mutate
.
library(rvest)
library(dplyr)
get_player_data <- function(player, id) {
base_url <- "http://naturalstattrick.com/playerreport.php?fromseason=20182019&thruseason=20182019&stype=2&sit=5v5&stdoi=oi&rate=n&v=g&playerid="
paste0(base_url, id) %>%
read_html() %>%
html_table(header = TRUE) %>%
.[[1]] %>%
mutate_at(vars(-starts_with("Game"), -starts_with("Team")),
funs(as.numeric(gsub("-", NA, .)))) %>%
mutate(player = player)
}
Теперь мы можем пройти через каждого игрока + id.Вместо цикла мы можем использовать pmap_df
из библиотеки purrr
.Это берет каждый игрок + id, отправляет его в нашу функцию и объединяет выходные данные в один фрейм данных в конце:
library(purrr)
player_data <- pmap_df(player_id, get_player_data)
Для ваших 3-х примеров игроков, это возвращает фрейм данных из 83 строк и 52столбцы, с именем игрока в последнем столбце.
Примечание: предполагается, что все данные игрока имеют ту же форму, что и 3 примера (52 столбца, пропущенные значения представлены -
).Если нет, функция, вероятно, выдаст ошибки.