2016-01-25 65 views
0

我正在尝试编写一个循环来执行readHTMLTable(),通过公式提供的连续日期列表。我已成功导入日期之间的所有数据。但是,该数据并不包含日期列,因此使用我提供循环的日期序列,我希望循环读取HTML表格,然后添加一个新列以及用于该迭代的日期。在日期列表中使用readHTMLTable并使用数据创建新日期列

这是我到目前为止有:

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

如果循环中没有'Sys.sleep',那么您违反了网站的[服务条款](http://www.sports-reference.com/termsofuse.shtml)。 – hrbrmstr

回答

1

考虑使用mapply()(apply系列的多元函数),其中您传递日期,网址和表格迭代器列表以下载html表格。您可以避免矩阵处理,因为format()可以提取部分日期类型。此外,请考虑不要将NULL用于不存在的URL,因为它可能以后不会绑定。只需过滤掉空的元素。

# 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浏览器 来读取在任何给定时间段内发送更多请求消息到站点服务器的方式访问 站点的方式,该方式比典型人类通常在 产生的同一时间段,查看和提交材料。

+0

嘿,谢谢你愿意帮忙。不幸的是,在我的结尾你的代码是不可重现的。我在'tabledwnld'函数中收到一个关于意外符号的错误,另一个错误是关于无法找到'readHTMLTable'的继承方法,关于无效类型/长度的循环的'dt'部分的错误(闭包/ 0)进行向量分配,然后最后出现一些关于意外“}”的错误。任何想法,为什么我会看到这些在我的目的? – medavis6

+0

查看更新。 “if”语句没有正确包裹在圆括号中。此外,XML库的[readHTMLTable](http://www.inside-r.org/packages/cran/xml/docs/readhtmltable)不会直接创建数据框,而是检索URL解析的'

'节点集。 – Parfait

+0

谢谢!代码现在全部运行。然而,我仍然有一个问题,'tables'命令返回一个0列表,然后'data'命令返回0 obs。 0个变量。 – medavis6