我正试图在cover.com上搜索每个MLB团队的结果,可以追溯到2007年。可以在这里找到一个示例页面:http://www.covers.com/pageLoader/pageLoader.aspx?page=/data/mlb/teams/pastresults/2016/team2979.html。
我有以下代码:
for (year in 2007:2016) {
for (id in 2955:2984){
url <- paste0("http://www.covers.com/pageLoader/pageLoader.aspx?page=/data/mlb/teams/pastresults/", year, "/team", id, ".html")
data <- readHTMLTable(url, stringsAsFactors = FALSE)
data <- data[[1]]
data$year <- year
data$id <- id
}
}
乍一看有效,但只返回一个数据框,其中包含9个变量的9个观测值,这些变量是2016年10月多伦多9场季后赛的比赛。显然,我在这里缺少一些东西?任何帮助深表感谢!提前谢谢!
答案 0 :(得分:2)
每次获得新数据时,您都会覆盖旧数据。你需要追加它。我还必须在这里做一点点黑客,因为你试图加载的300个表名称略有不一致。此外,下载300张桌子花了太长时间,所以我改变了你的限制,只让两支球队连续两年。如果您确信它正在工作,您可以将其更改为全部300.
尽量贴近您的代码:
library("XML")
data = c()
for (year in 2007:2008) {
for (id in 2955:2956){
url <- paste0("http://www.covers.com/pageLoader/pageLoader.aspx?page=/data/mlb/teams/pastresults/",
year, "/team", id, ".html")
temp <- readHTMLTable(url, stringsAsFactors = FALSE)
temp <- temp[[1]]
temp$year <- year
temp$id <- id
if(is.data.frame(data)) {
names(temp) = names(data)
data = rbind(data, temp)
} else {
data=temp
}
}
}
dim(data)
[1] 498 9
答案 1 :(得分:0)
另一种选择:
data <- lapply(2007:2016,function(x){
lapply(2955:2956,function(y){
url <- paste0("http://www.covers.com/pageLoader/pageLoader.aspx?page=/data/mlb/teams/pastresults/", x, "/team", y, ".html")
readHTMLTable(url, stringsAsFactors = FALSE)
})
})
names(data) <- paste0("x",as.character(2007:2016))
for(i in paste0("x",as.character(2007:2016))) names(data[[i]]) <- paste0("x",as.character(2955:2956))
您的数据将在之后称为数据的嵌套列表中。然后,您可以使用:data$x2007$x2955
访问每个表,因为它是嵌套列表。