我正在尝试编写一个循环来对我通过公式提供的连续日期列表执行readHTMLTable()
。我已成功导入日期之间的所有数据。但是,该数据不具有日期列,因此使用我提供循环的日期序列,我希望循环读取HTMLMLable,然后添加一个新列,其中包含用于该迭代的日期。
这是我到目前为止所做的:
library(XML)
library(RCurl)
library(plyr)
# create the days
x <- seq(as.Date("2015-04-10"), as.Date("2015-04-15"), by = "day")
# create a url template for sprintf()
utmp <- "http://www.basketball-reference.com/friv/dailyleaders.cgi?month=%d&day=%d&year=%d"
# convert to numeric matrix after splitting for year, month, day
m <- do.call(rbind, lapply(strsplit(as.character(x), "-"), type.convert))
# create the list to hold the results
tables <- vector("list", length(m))
# get the tables
for(i in seq_len(nrow(m))) {
# create the url for the day and if it exists, read it - if not, NULL
tables[[i]] <- if(url.exists(u <- sprintf(utmp, m[i, 2], m[i, 3], m[i, 1])))
readHTMLTable(u, stringsAsFactors = FALSE)
else NULL
}
data <- ldply(tables,data.frame)
所以基本上,我希望我的最终数据框能够将m
作为一个名为data$Date
的新列。
感谢您提供任何帮助,如果您需要任何澄清,请与我们联系!
答案 0 :(得分:1)
考虑使用mapply()
(应用系列的多变量函数),在其中传递日期,网址和表迭代器列表以下载html表。您可以避免矩阵处理,因为format()
可以提取部分日期类型。另外,请考虑不对不存在的URL使用NULL,因为它可能不会在之后绑定。只需过滤掉空元素。
# LIST OF DATES
x <- lapply(0:5, function(i) as.Date("2015-04-10")+i)
# LIST OF URLS
utmp <- "http://www.basketball-reference.com/friv/dailyleaders.cgi?month=%d&day=%d&year=%d"
urlist <- c(lapply(x, function(i) sprintf(utmp, as.numeric(format(i, '%m')),
as.numeric(format(i, '%d')),
as.numeric(format(i, '%y')))))
# USER DEFINED FUNCTION
tables <- vector("list", length(x))
tabledwnld <- function(dt, url, i) {
if (url.exists(url)) {
tableNodes <- readHTMLTable(url)
tables[[i]] <- tableNodes[[1]]
tables[[i]]['Date'] <- dt
return(tables)
}
}
# APPLY ABOVE FUNCTION (RETURNS LARGE MATRIX OF TABLES)
data <- mapply(tabledwnld, x, urlist, 1:6)
# BIND TO DATA FRAME
finaldata <- do.call(rbind, data)
另外,请注意评论中的@ hrbrmstr警告,如下所示。您可能希望将表格下载空间分开:
除非本段另有规定,否则您同意不这样做 使用或启动任何自动化系统,包括但不限于 访问机器人,蜘蛛,离线阅读器或类似设备 站点以向站点服务器发送更多请求消息的方式 在任何给定的时间段内,通常都是典型的人 通过使用传统的在线Web浏览器在同一时期生产 阅读,查看和提交材料。