将对象向量转换为字符串以添加到R中的For循环中的列

时间:2019-02-12 01:14:06

标签: r

我想做的是在游戏日志数据框中创建一列,以将守门员向量中的守门员姓名分配给该列

有没有办法做到这一点?

我听说过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 :(得分:1)

我会采取不同的方式。首先,我将播放器的名称和ID存储在列表或数据框中。例如:

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

接下来,我将编写一个函数,该函数接受playerid并从网站返回添加了播放器名称列的数据的数据帧。

我的函数使用rvest库,该库提供read_htmlhtml_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列,缺少值-表示)。如果没有,该函数可能会给出错误。

答案 1 :(得分:0)

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)
}

这是您要寻找的吗?