2011-03-25 163 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