2014-04-29 1 views
3

R에 익숙하지 않으므로 XML 파일에서 두 값을 추출하고 5603을 반복하는 방법을 배우려고합니다. 다른 (작음, < 2kb) 내 작업 디렉토리에있는 XML 파일.R에서 XML 파일에서 두 개의 값을 추출하고 5603 개 이상의 파일을 반복하여 테이블에 쓰는 방법

저는 '루핑'에 대해 많은 주제를 읽었지만, 다소 혼란 스럽습니다. 특히 XML 파일을 반복하는 것이 다른 파일을 반복하는 것과 다르니까요. 맞습니까?

XML 데이터 구조로 온라인 데이터를 사용하고 있습니다.

각 XML 파일에 대해 "ZipCode"및 "AwardAmount"를 테이블에 쓰려고합니다.

다음 코드를 실행하면 맨 처음 파일에서만 ZipCode 및 AwardAmount가 검색되었습니다. 어떻게하면 적절한 루프를 작성하고 테이블에 쓸 수 있습니까?

xmlfiles=list.files(pattern="*.xml") 
for (i in 1:length(xmlfiles)){ 
    doc= xmlTreeParse("xmlfiles[i]", useInternal=TRUE) 
    zipcode<-xmlValue(doc[["//ZipCode"]]) 
    amount<-xmlValue(doc[["//AwardAmount"]]) 
} 

누구에게 의견이 있습니까?

+1

글쎄, "xmlfiles [i]"'는 확실히 작동하지 않을 것입니다. 'paste (xmlfiles, seq_along (xmlfiles), sep = "")' –

답변

4

이 방법이 유용 할 수 있습니다. 나는 for 루프를 제거하고 sapply과 함께 갔다.

xmlfiles <- list.files(pattern = "*.xml") 
txtfiles <- gsub("xml", "txt", xmlfiles, fixed = TRUE) 

txtfiles 새로운 파일 이름의 집합은 각 실행의 출력 파일로 사용됩니다.

sapply(seq(xmlfiles), function(i){ 

    doc <- xmlTreeParse(xmlfiles[i], useInternal = TRUE) 
    zipcode <- xmlValue(doc[["//ZipCode"]]) 
    amount <- xmlValue(doc[["//AwardAmount"]]) 
    DF <- data.frame(zip = zipcode, amount = amount) 
    write.table(DF, quote = FALSE, row.names = FALSE, file = txtfiles[i]) 

}) 

실행하는 데 문제가 있으면 알려주십시오.

+1

리처드, 대단히 감사합니다! 이 코드는 매력처럼 작동합니다. 감사! –

+0

좋아요. 나는 그것이 당신을 위해 일해서 다행입니다. –

2

리처드 (조금만)에 약간 다른 접근 방식. ldply을 사용하여 데이터 프레임을 만들어 파일에 기록했습니다.

setwd("LOCATION_OF_XML_FILES") 

xmlfiles <- list.files(pattern = "*.xml") 

dat <- ldply(seq(xmlfiles), function(i){ 

    doc <- xmlTreeParse(xmlfiles[i], useInternal = TRUE) 

    zipcode <- xmlValue(doc[["//ZipCode"]]) 
    amount <- xmlValue(doc[["//AwardAmount"]]) 

    return(data.frame(zip = zipcode, amount = amount)) 

}) 

head(dat) 
##   zip amount 
## 1 442420001 45000 
## 2 479072114 400580 
## 3 303320420 22050 
## 4 326112002 12000 
## 5 265066845 37000 
## 6 168027000 300000 

write.csv(dat, "zipamount.csv", row.names=FALSE) 

당신은 사용할 수 있습니다 : 당신은 ldply 기능은 자신의 인의 "배짱"부터 대답을 자신을 선택해야하지만, 이것은 단지 그것을하는 다른 방법을 보여줍니다 (당신이 많은 파일 대 한 파일을 원하는 가정) append=TRUE 리차드의 접근 방식과 같은 것을 할 write.table에서 하나의 파일 이름을 사용합니다. write.csv (또는 write.table)의 출력 설정을 미세 조정하여 최종 출력 형식을 얻을 수도 있습니다.

list.filesrecursive = TRUE을 추가하여 ~ 5,600 개의 파일을 모두 하나의 디렉토리에 둡니다 (일부 파일 시스템/운영 체제에서 성능 문제가 발생할 수 있음) 할 수 있습니다.

+0

hrbrmstr, 의견에 대해 감사드립니다. 귀하의 방법을 사용하여 하나의 파일을 만들 수있었습니다. 귀하의 의견은 제가 진행하고있는 일을 훨씬 잘 이해하는 데 도움이되었습니다. 고맙습니다. –

관련 문제