如何在R中对`paste`函数进行矢量化?

时间:2016-03-16 21:08:10

标签: r text concatenation vectorization

假设我有一个字符串(行)向量,我使用readLines从.txt网页上抓取。一些行将以“<”开头,通常表示新段落的开头。一些行将以字母开头,通常表示它连接到它之前的行。我希望能够连接属于同一段的行。

我的计划是找到以“<”开头的行,并连接以“<”开头的两行之间的所有行。从本质上讲,我最终得到了一系列指数。例如,我可能想要连接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行将保持不变。

2 个答案:

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

答案 1 :(得分:1)

这是基础R解决方案。两个grep操作将段落的起始行和停止行提供给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>" 一起折叠:

function checkRegexp( o, regexp, n ) {

  if ( !( regexp.test( o.val() ) ) ) {

    o.addClass( "ui-state-error" );

    updateTips( n );

    return false;

  } else {

    return true;

  }

}