2016-12-28 84 views
2

我試圖從棒球參考網站上抓取玩家數據,使用函數爲每個玩家循環多年(變量「年份」)由「playerid」表示。使用R中的函數來抓取網站,返回「下標越界」錯誤

library(plyr) 
library(XML) 

fetch_stats <- function(playerid, year) { 
    url <- paste0("http://www.baseball-reference.com/players/gl.cgi?id=",playerid,"&t=b&year=",year) 
    data <- readHTMLTable(url, stringsAsFactors = FALSE) 
    data <- data[[3]] 
    data$Year <- year 
    data$PlayerId <- playerid 
    data 
} 

此功能工作得很好,當它被應用到一個單一的一年的數據,因爲在這裏看到:一旦

AdrianGonzales <- ldply("gonzaad01", fetch_stats, year= 2008, .progress="text") 

然而,正如我實際上是通過多次使用該函數循環多年的職業球員,總是吐出以下錯誤:

AdrianGonzales <- ldply("gonzaad01", fetch_stats, year= 2009:2004, .progress="text") 

Error in data[[3]] : subscript out of bounds 
In addition: Warning message: 
XML content does not seem to be XML: 'http://www.baseball- reference.com/players/gl.cgi?id=gonzaad01&t=b&year=2009 
http://www.baseball-reference.com/players/gl.cgi?id=gonzaad01&t=b&year=2008 
http://www.baseball-reference.com/players/gl.cgi?id=gonzaad01&t=b&year=2007 
http://www.baseball-reference.com/players/gl.cgi?id=gonzaad01&t=b&year=2006 
http://www.baseball-reference.com/players/gl.cgi?id=gonzaad01&t=b&year=2005 
http://www.baseball-reference.com/players/gl.cgi?id=gonzaad01&t=b&year=2004' 

從我已經能夠找到的「下標越界」當你超過LIM發生錯誤它是一個定義在R中的數據集。對於這個特定的函數,我可能只是愚蠢的,但我不明白這種情況將如何應用 - 或者爲什麼它可以在一年內工作,但不是一次一個。

我願意接受任何和所有的建議。提前致謝。

+0

爲了完整性,您可以爲'XML'和'plyr'添加庫函數嗎? – steveb

+0

圖書館電話添加。 – ImTerribleWithComputers

回答

2

您可以按照以下方式使用lapply。我對fetch_stats進行了小修改,因爲第6列似乎沒有名字。您可以按照自己喜歡的方式進行操作,只是爲了說明如何使用lapply

library(plyr) 
library(XML) 

# Minor change made to get function working (naming column 6) 
fetch_stats <- function(playerid, year) { 
    url <- paste0("http://www.baseball-reference.com/players/gl.cgi?id=",playerid,"&t=b&year=",year) 
    data <- readHTMLTable(url, stringsAsFactors = FALSE) 
    data <- data[[3]] 
    data$Year <- year 
    data$PlayerId <- played 
    ### Column six name is empty. 
    names(data)[6] <- 'EMPTY' 
    data 
} 
res <- lapply(2009:2004, function(x) fetch_stats("gonzaad01", x)) 
resdf <- ldply(res) 

這將創建6元,一年一個列表,然後將列表轉換爲data.frame

ldapply是在你的代碼中應用的方式,它是不是在給它一個一年時間,它是一次完成所有年份的整個向量。

編輯

尋找一點點接近後,這裏是用ldply

new_res <- ldply(.data = 2009:2004, 
       .fun = function(x) fetch_stats("gonzaad01", x), 
       .progress="text") 

這給了我同樣的結果與上述其他方法解決。

+1

這很好,我不知道第六列是空的。非常感謝! – ImTerribleWithComputers