2011-03-25 5 views
2

for 루프를 사용하여 목록에서 값을 추출하려고합니다. 이 목록에는 웹 페이지에서 스크랩 한 77 개의 요소가 포함되어 있습니다. 그것들은 strsplit이 다소 엉망인 정규 표현식과 일치하는 목록에 포함되었습니다. 내가 함께해야하는 각 요소의 부품을 추출하기 위해 노력했다for 루프를 사용하여 목록에서 요소 가져 오기

> chunk[76] 
[[1]] 
[1] ""                      
[2] "<img src=\"/images/"                 
[3] "tats/flags/mn.png\" height=\"14\" alt='mn' title='mn' />"        
[4] "Mongolia"                    
[5] "mn"                     
[6] "1"                      
[7] "1"                      
[8] "21.95"                     
[9] ""                      
[10] "<img src=\"/images/"                 
[11] "tats/other/hp.png\" width=\"2\" height=\"5\" alt='Pages: 1' title='Pages: 1' /><br />" 

:

for (i in length(chunk)) { 
    values <- chunk[[i]][c(4,6:8)] 
} 

결과 값에 대해 반환을 항상처럼

chunk <- strsplit(lines, "(<tr>|</td>)(<td>|<td[^>]+>)|aws| MB| KB") 

샘플 요소 본다 마지막 목록 요소의 추출 부분은 (chunk[[77]])

누구나 제안 할 수있는 방법 오에 모든 목록 요소에 필요한 값을 얻습니다.

+3

, XML 페이지의 xpath는 HTML 페이지를 구문 분석 할 때 옵션이 될 수 있습니다. – daroczig

+0

@ daroczig, 감사합니다. 나는 이것을 조사 할 것이다. – John

답변

2

당신은 루프 대신의 do.call(rbind, ...)으로 lapply을 사용할 수 있습니다. 예를 들어 사용하는 대신 RegExpr는

chunk <- list(
    c("", "<img src=\"/images/", 
    "tats/flags/mn.png\" height=\"14\" alt='mn' title='mn' />", 
    "Mongolia", "mn", "1", "1", "21.95", "", "<img src=\"/images/", 
    "tats/other/hp.png\" width=\"2\" height=\"5\" alt='Pages: 1' title='Pages: 1' /><br />"), 
    c("", "<img src=\"/images/", 
    "tats/flags/mn.png\" height=\"14\" alt='mn' title='mn' />", 
    "Mongolia", "mn", "1", "1", "21.95", "", "<img src=\"/images/", 
    "tats/other/hp.png\" width=\"2\" height=\"5\" alt='Pages: 1' title='Pages: 1' /><br />")) 
do.call(rbind, lapply(chunk, `[`, c(4,6:8))) 
#  [,1]  [,2] [,3] [,4] 
# [1,] "Mongolia" "1" "1" "21.95" 
# [2,] "Mongolia" "1" "1" "21.95" 
+1

+1입니다. –

+0

나는 당신이 Joris/Joshua를 의미하는 것을 본다. 'as.data.frame (do.call (rbind, lapply (chunk,'[', c (4,6 : 8))))'은 for 루프없이 원하는 출력을 준다. 감사 – John

4

values <- chunk[[i]][c(4,6:8)]values <- rbind(values,chunk[[i]][c(4,6:8)])으로 바꿔야합니다 (루프 전에 values <- NULL을 초기화하십시오).

또는 루프 values <- matrix(0,length(chunk),4) 전에 행렬을 만들고 루프에서 values[i,] <- chunk[[i]][c(4,6:8)]을 사용할 수 있습니다. 이것은 더 효율적입니다!

+0

뷰티, 그것은 두 번째 대답에 대해 행렬 (0, 길이 (청크), 4) 값을 읽어야하지만 이것이 효과가 있습니다. 시간과 조언에 감사드립니다. – John

+0

@John이 (가) 수정하려고 시도했습니다 ... – teucer

+0

for-loop를 모두 제거해야합니다. –

-1

내가 대신 펄을 사용하도록 권합니다. 당신이하고 싶은 작업을 수행하는 것이 훨씬 더 편리합니다.

+0

감사합니다. Perl을 사용할 시간이 있는지 잘 모르겠습니다. 나는 R과 함께 Python을 배우려고 노력하고 있으며 Perl을위한 시간도 없을 것입니다. – John

+0

왜 downvotes ??? 나는 1 년 전에 똑같은 문제에 직면했고 대신 Perl을 사용하기 시작했다. –

+1

@ 존 지금은 새로운 언어를 계속 배우는 데 시간이 많이 걸립니다. 그러나 위의 작업에서 Perl은 자기야된다는 것을 알게 될 것입니다. 해피 코딩! Christian –

관련 문제