2016-01-25 6 views
0

Я пытаюсь написать цикл для выполнения readHTMLTable() над списком последовательных дат, которые я предоставляю по формуле. Я успешно импортировал все данные между датами. Однако эти данные не содержат столбца даты, поэтому, используя последовательность дат, я предоставляю цикл, я бы хотел, чтобы цикл читалHTMLTable, а затем добавил новый столбец с датой, используемой для этой итерации.Используйте 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), где вы передаете список дат, URL-адресов и итераторов таблиц для загрузки таблиц 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 в комментариях, как говорится ниже. Вы можете пространства из вашей таблицы загрузки:

За исключением случаев, специально оговоренных в настоящем пункте, вы соглашаетесь не использования или запустить любую автоматизированную систему, в том числе, без ограничения, роботов, пауков, автономных читателей, или как устройствах, которые обращаются к сайту таким образом, который отправляет больше запросов на сервер сайта за любой заданный период времени, чем обычный человек обычно будет производить в тот же период с помощью обычного он-лайн веб-браузера читать , просматривать и представлять материалы.

+0

Эй, спасибо за то, что я хочу помочь. К сожалению, на моем конце ваш код не воспроизводится. Я получаю сообщение об ошибке в отношении неожиданного символа в функции tabledwnld, еще одна ошибка в том, что вы не можете найти унаследованный метод для 'readHTMLTable', ошибку в части' dt' цикла относительно недопустимого типа/длины (замыкание/0) в векторном распределении, а затем, наконец, пару ошибок о неожиданном «}». Любая идея, почему я увижу их на моем конце? – medavis6

+0

См. Обновление. Оператор 'if' не был правильно скопирован в круглые скобки. Кроме того, библиотека [readHTMLTable] библиотеки XML (http://www.inside-r.org/packages/cran/xml/docs/readhtmltable) напрямую не создает фреймворк данных, а извлекает анализируемый узел '

' узла URL. – Parfait

+0

Спасибо! Теперь код запускается. Тем не менее, у меня по-прежнему возникает проблема, когда команда 'tables' возвращает список 0, который затем возвращает команду' data' 0 obs. из 0 переменных. – medavis6