2016-12-28 1 views
2

私はBaseball Referenceのウェブサイトから各プレーヤーの複数の年(変数「年」)をループする関数を使用して、 「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") 

、できるだけ早く私は実際には複数をループに関数を使用して選手のキャリアの中で年が、それは常に次のエラー吐く:あなたはLIMを超えたときに私は、「範囲外の添字」を見つけることができたものから、

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' 

をエラーが発生しましたこの特定の関数については、私はちょうどダムかもしれませんが、このケースではどのように適用されるのでしょうか、または1年の間に何が働くのかはわかりません。 。

私はすべての提案を受け付けています。早めにありがとう。

+0

'XML'と' plyr'の 'library'呼び出しを完全性のために質問に追加できますか? – steveb

+0

ライブラリ呼び出しが追加されました。 – ImTerribleWithComputers

答えて

2

lapplyは次のように使用できます。 fetch_statsに小さな修正を加えました。返された6番目の列に名前がないようです。代わりにlapplyの使い方を示すだけで、好きなことをすることができます。それは時に1年間それを与えていない、ldapplyはあなたのコードに適用される方法を

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つの要素、各年の1のリストを作成しますdata.frame

にリストを変換します時間の全体的なベクトルを一気に与えています。

EDIT

もう少し近くに見た後、ここにldply

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

を使用したソリューションがあるこれは私に上記の他の方法と同様の結果が得られました。

+1

これは素晴らしく、6番目の列が空であることはわかりませんでした。本当にありがとう! – ImTerribleWithComputers

関連する問題