2016-03-16 25 views
0

假设我使用readLines从.txt网页抓取的字符串(线条)向量。一些线路将以“<”开头,通常表示新段落的开始。一些行将以字母开头,通常表示它连接到它之前的行。我希望能够连接属于同一段落的行。如何矢量化R中的`paste`函数?

我的计划是找到以“<”开头的行,并连接以“<”开头的两行之间的所有行。基本上,我最终得到一个索引列表。例如,我可能想连接lines[1:3],lines[4:4],lines[5:9]等等。有没有一种方法来对此进行矢量化?我不能只做paste(lines[begin.index : end.index]),但这可能会让你知道我希望达到的目标。

下面是一些虚拟的数据为例,因为我的实际数据是太长:

[1] "<P> sampletextsampletext" 
[2] "sampletextsampletext</P>" 
[3] "<P> sampletext" 
[4] "sampletext" 
[5] "sampletext</P>" 
[6] "<P> sampletext </P>" 

我会想连接线1和2一起,喜欢3,4,5在一起,行6将保持不变。

+4

请注明您的数据的样本。单从描述来看,您的问题并不十分清楚。 – nrussell

+7

你必须明白,询问“如何矢量化粘贴()”对于R人来说听起来很奇怪,因为paste()_is_是矢量化的。也许你只是在寻找'collapse'参数? – joran

+1

对我来说听起来就像你有一组行(1:3,4:4,5:9),你需要知道如何将'paste'和'collapse'参数应用到每个组。 'dplyr'或'data.table'在这里是你的朋友,尽管'aggregate'可能工作得很好。 – Gregor

回答

3

如果您尝试分离HTML节点,最好使用理解HTML的函数。这样做的好处是无需手动查找开始和结束标签。

# read in data 
lines <- c("<P> sampletextsampletext", 
      "sampletextsampletext</P>" , 
      "<P> sampletext", 
      "sampletext", 
      "sampletext</P>", 
      "<P> sampletext </P>") 

# load a simple HTML scraping/parsing package 
library(rvest) 

# find all `<p>` tags and their contents 
lines %>% paste(collapse = '') %>% read_html() %>% html_nodes('p') 
# {xml_nodeset (3)} 
# [1] <p> sampletextsampletextsampletextsampletext</p> 
# [2] <p> sampletextsampletextsampletext</p> 
# [3] <p> sampletext </p> 
+0

谢谢你的回答!我最初使用rvest,但遇到了困难。我想我只是不知道如何正确使用它。当我在我的数据上尝试这种方法时,出现错误'错误:名称d:2qwt不符合XML命名空间[202]'。你以前见过类似的东西吗? – xyy

+0

如果没有看到数据的相关部分,我真的无法帮助,但实际上'readLines'是一种导入HTML的不好方法,这可能是问题所在。相反,传递'read_html()'URL或文件路径直接以HTML格式读取数据。有可能它实际上只是格式不正确的HTML,但在查找数百行代码之前,请确保它不是您的过程。 – alistaire

1

这是一个基本的R解决方案。这两个grep的操作提供了段落到mapply -administered功能的启动和停止线与paste一起塌陷他们:

> txt <- scan(what="") 
1: "<P> sampletextsampletext" 
2: "sampletextsampletext</P>" 
3: "<P> sampletext" 
4: "sampletext" 
5: "sampletext</P>" 
6: "<P> sampletext </P>" 
7: 
Read 6 items 
> grep("<P>", txt) 
[1] 1 3 6 
> grep("</P>", txt) 
[1] 2 5 6 
> mapply(function(x,y) paste(txt[x:y], collapse=" "), grep("<P>", txt), grep("</P>", txt)) 
[1] "<P> sampletextsampletext sampletextsampletext</P>" 
[2] "<P> sampletext sampletext sampletext</P>"   
[3] "<P> sampletext </P>"