Преобразование вектора объектов в строки для добавления в столбец цикла For в R - PullRequest
0 голосов
/ 12 февраля 2019

Что я хочу сделать, это создать столбец во фрейме данных игрового журнала, который присваивает имя вратаря из вектора вратаря столбцу

Есть ли способ сделать это?

Я слышал о deparse (substitute ()), но когда я его использую, он не работает в моем цикле for

library(XML)

Howard<-'http://naturalstattrick.com/playerreport.php?fromseason=20182019&thruseason=20182019&stype=2&sit=5v5&stdoi=oi&rate=n&v=g&playerid=8470657'


Lehner<-'http://naturalstattrick.com/playerreport.php?fromseason=20182019&thruseason=20182019&stype=2&sit=5v5&stdoi=oi&rate=n&v=g&playerid=8475215'

Binnington<-'http://naturalstattrick.com/playerreport.php?fromseason=20182019&thruseason=20182019&stype=2&sit=5v5&stdoi=oi&rate=n&v=g&playerid=8476412'

Goalies<-c(Howard, Lehner, Binnington)

gamelog<-data.frame()

   for(goalie in Goalies){
   goaliehtml<-readHTMLTable(goalie)
   goaliedata<-goaliehtml[['gamelog']]
   goaliedata$player<-deparse(substitute(goalie))
   gamelog<-rbind(gamelog, goaliedata)
}

Я хочу, чтобы goaliedata $ player был равен вратарюкоторый проходит через цикл for

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Я бы подошел к этому иначе.Во-первых, я бы сохранял имена и идентификаторы игроков в списке или во фрейме данных.Например:

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 столбца, пропущенные значения представлены -).Если нет, функция, вероятно, выдаст ошибки.

0 голосов
/ 12 февраля 2019

goalie не содержит имя вратаря.Итак, сначала вы дадите вектору Goalies и имена вратарей.

library(XML)

Howard<-'http://naturalstattrick.com/playerreport.php?fromseason=20182019&thruseason=20182019&stype=2&sit=5v5&stdoi=oi&rate=n&v=g&playerid=8470657'

Lehner<-'http://naturalstattrick.com/playerreport.php?fromseason=20182019&thruseason=20182019&stype=2&sit=5v5&stdoi=oi&rate=n&v=g&playerid=8475215'

Binnington<-'http://naturalstattrick.com/playerreport.php?fromseason=20182019&thruseason=20182019&stype=2&sit=5v5&stdoi=oi&rate=n&v=g&playerid=8476412'

Goalies<-c(Howard, Lehner, Binnington)
# give the vector the names of the goalies
names(Goalies) <- c("Howard", "Lehner", "Binnington")

gamelog<-data.frame()

for(i in 1:length(Goalies)) {
  goaliehtml<-readHTMLTable(Goalies[i])
  goaliedata<-goaliehtml[['gamelog']]
  goaliedata$player<-names(Goalies[i])
  gamelog<-rbind(gamelog, goaliedata)
}

Это то, что вы ищете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...