2012-12-13 28 views
0

考虑下面的代码:GSUB单词列表中的一个段落

list = c("the", "at", "ok") 
paragraph = "the cat ath the hat is ok" 

如何删除从“段落”列表中的所有的话吗?

我试着这样做:

gsub(list, '', paragraph)

但除去只列出的第一项。我知道这不应该很复杂,但这仍然让我感到困惑。另外我想避免使用for循环,但适用系列应该没问题。

回答

4

模式"(the|at|ok)"将匹配列表中任何字符串的出现次数。

虽然这听起来像是你想要匹配那些实际的单词,但不是它们所属的单词(即匹配“the”而不是“then”,“at”而不是“rattle”等)如果是这种情况,则可以改为使用"\\b(the|at|ok)\\b"(其中"\\b"是在单词边界处匹配的模式)的模式。

您可以使用paste0()从匹配单词的任意载体构建所需的模式:

list <- c("the", "at", "ok") 
paragraph <- "the cat ath the hat is ok" 

## Construct the regular expression 
pat <- paste0("\\b(", paste0(list, collapse="|"), ")\\b")  
pat 
# [1] "\\b(the|at|ok)\\b" 

## Use it 
gsub(pat, "", paragraph) 
# [1] " cat ath hat is " 
+0

谢谢你的答案。有没有更自然的做法呢? – user1103294

+0

@ user1103294我想我们会发现!在一个相关的说明中,我很想知道这是更快,更慢还是与在for循环中一次处理单词相同的速度。在任何情况下,这* *工作*,所以它至少得到*那*为它;) –

+0

聪明的答案的方式 – user1103294

相关问题