2012-08-03 3 views
2

이 readHTML 함수의 데이터 프레임을 가져오고 저장하는 작업을 자동화하려고합니다. 나는 R 초보자이며, 하나 하나 수행 할 경우 작동하는이 기능을 자동화하는 루프를 작성하는 방법을 알아내는 데 어려움을 겪고 있습니다.여러 HTML 테이블을 읽는 방법 R

library('XML') 

urls<-c("http://www.basketball-reference.com/teams/ATL/","http://www.basketball-reference.com/teams/BOS/") 
theurl<-urls[2] #Pick second link (celtics) 

tables <- readHTMLTable(theurl) 
n.rows <- unlist(lapply(tables, function(t) dim(t)[1])) 
BOS <-tables[[which.max(n.rows)]] 
Team.History<-write.csv(BOS,"Bos.csv") 

모든 도움을 주시면 매우 감사하겠습니다.

+0

'lapply'을 사용하는 방법을 알고있는 것 같습니다. 'lapply' 기술을'urls' 벡터에 사용하는 것을 고려 했습니까? – joran

+0

'write.csv'의 결과를 변수에 할당 할 필요가 없음에 유의하십시오. – seancarmody

답변

1

URL 벡터를 반복하고 싶다고 가정하고 있습니까? 나는 이런 식으로 시도 할 것이다 :

library('XML') 

url_base <- "http://www.basketball-reference.com/teams/" 
teams <- c("ATL", "BOS") 

# better still, get the full list of teams as in 
# http://stackoverflow.com/a/11804014/1543437 

results <- data.frame() 
for(team in teams){ 
    theurl <- paste(url_base, team , sep="/") 
    tables <- readHTMLTable(theurl) 
    n.rows <- unlist(lapply(tables, function(t) dim(t)[1])) 
    team.results <-tables[[which.max(n.rows)]] 
    write.csv(team.results, file=paste0(team, ".csv")) 
    team.results$TeamCode <- team 
    results <- rbind(results, team.results) 
} 
write.csv(results, file="AllTeams.csv") 
+0

모든 결과를 하나의 파일로 묶을 수도 있습니다 (위의 대답에서 업데이트 참조). – seancarmody

2

나는 이것이 두 답변 (그리고 약간의 정돈)의 장점을 결합했다고 생각한다.

library(RCurl) 
library(XML) 

stem <- "http://www.basketball-reference.com/teams/" 
teams <- htmlParse(getURL(stem), asText=T) 
teams <- xpathSApply(teams,"//*/a[contains(@href,'/teams/')]", xmlAttrs)[-1] 
teams <- gsub("/teams/(.*)/", "\\1", teams) 
urls <- paste0(stem, teams) 

names(teams) <- NULL # get rid of the "href" labels 
names(urls) <- teams 

results <- data.frame() 
for(team in teams){ 
    tables <- readHTMLTable(urls[team]) 
    n.rows <- unlist(lapply(tables, function(t) dim(t)[1])) 
    team.results <- tables[[which.max(n.rows)]] 
    write.csv(team.results, file=paste0(team, ".csv")) 
    team.results$TeamCode <- team 
    results <- rbind(results, team.results) 
    rm(team.results, n.rows, tables) 
} 
rm(stem, team) 

write.csv(results, file="AllTeams.csv") 
+0

숀 이것은 대단합니다. 고맙습니다! 나는 너 자신을 즐겁게하는 스포츠를 위해 그것을 사용하기를 희망한다. 당신이 기뻐하고있는 다른 스포츠 관련 근근이 살아가는 것들에 대해 계속 연락하십시오. 트위터에 나를 태워라 @abresler –

+0

나는 올림픽 수법에 관해 생각 해왔다. 그러나 시간을 꽤 알지 못했다. 아마도 너무 많은 시간이 필요할까요? – seancarmody

관련 문제