使用for循环从列表中获取元素

时间:2011-03-25 07:51:54

标签: list r for-loop

我正在尝试使用forloop从列表中提取值。该列表包含我从网页上抓取的77个元素。他们被列入一个列表,其中strsplit与一个相当混乱的正则表达式相匹配。

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

的提取部分

任何人都可以建议如何获取每个列表元素所需的值。

3 个答案:

答案 0 :(得分: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)]。这样效率更高!

答案 1 :(得分: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"

答案 2 :(得分:-1)

我建议改用Perl。在执行你想做的操作(我假设)时,它会更方便。