2011-03-25 55 views
2

我正在嘗試使用forloop從列表中提取值。該列表包含我從網頁上抓取的77個元素。他們被列入一個與strsplit匹配的相當凌亂的正則表達式的列表。使用for循環從列表中獲取元素

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

的樣品元件看起來像:

> 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[[77]])

任何人都可以建議如何o爲每個列表元素保留我需要的值。

+3

而不是regexpr,使用例如,如果您解析HTML頁面,則XML包中的xpath可能是一個選項。 – daroczig 2011-03-25 08:50:27

+0

@daroczig,謝謝。我會研究這個。 – John 2011-03-25 10:05:22

回答

2

您可以使用lapplydo.call(rbind, ...)而不是for循環。

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爲最佳解決方案。 – 2011-03-25 15:21:44

+0

我明白你的意思是約里斯/約書亞。 'as.data.frame(do.call(rbind,lapply(chunk,'[',c(4,6:8))))'給出了所需的輸出,沒有forloop。謝謝 – John 2011-03-26 01:59:22

4

您應該用values <- rbind(values,chunk[[i]][c(4,6:8)])替換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 2011-03-25 10:15:38

+0

@John編輯糾正... – teucer 2011-03-25 11:54:32

+0

你應該完全擺脫for-loop。 – 2011-03-25 15:22:02

-1

我會建議使用Perl代替。在執行操作(我假設)你想要做得更方便。

+0

謝謝基督徒。我不確定是否有時間使用Perl。我正在嘗試與R一起學習Python,並且可能沒有時間用於Perl。 – John 2011-03-25 10:06:08

+0

爲什麼downvotes ???一年前我面臨同樣的問題,並開始使用Perl,這使我能夠做更多事情。 – 2011-03-25 10:21:44

+1

@John我現在繼續學習新的語言很費時。但是,對於上面的任務,你會發現Perl是一個寶貝。快樂的編碼! Christian – 2011-03-25 10:23:08