我想做的是在游戏日志数据框中创建一列,以将守门员向量中的守门员姓名分配给该列
有没有办法做到这一点?
我听说过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循环中运行的守门员
答案 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
接下来,我将编写一个函数,该函数接受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列,缺少值-
表示)。如果没有,该函数可能会给出错误。
答案 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)
}
这是您要寻找的吗?