2014-04-06 59 views
7

(我正在使用R.)对于名为“goodwords.corpus”的单词列表,我循环遍历文集中的文档,并将单词“goodwords.corpus”中的每个单词替换为单词+一个数字。让gsub只替换整个单词?

因此,举例来说,如果字“好”是在名单上,而“晚安”是不在名单上,那么这个文件:

I am having a good time goodnight 

会变成:

I am having a good 1234 time goodnight 

**我使用这个代码(编辑 - 使这个重复性):

goodwords.corpus <- c("good") 
test <- "I am having a good time goodnight" 
for (i in 1:length(goodwords.corpus)){ 
test <-gsub(goodwords.corpus[[i]], paste(goodwords.corpus[[i]], "1234"), test) 
} 

然而,问题是我想GSUB只更换整套WO RDS。出现的问题是:“良好”在“goodwords.corpus”列表中,但是不在列表中的“晚安”也受到影响。所以,我得到这个:

I am having a good 1234 time good 1234night 

反正是有,我可以告诉GSUB只能更换整个单词,而不是的话,可能是其他词的一部分?

我想用这样的:

test <-gsub("\\<goodwords.corpus[[i]]\\>", paste(goodwords.corpus[[i]], "1234"), test) 
} 

我读过的\ <和\>将告诉GSUB仅查找整个单词。但显然这不起作用,因为goodwords.corpus [[i]]在引号中时不起作用。

有什么建议吗?

+0

请让你的例子可重现:http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

+0

是的。请做。你在这里有机会。 GG是正则表达式解决方案的公认大师。 –

+0

刚刚编辑原始帖子与可重复的代码。非常感谢!! – user2303557

回答

7

您是所以接近得到这。你已经使用paste来形成替换字符串,为什么不使用它来形成模式字符串?

goodwords.corpus <- c("good") 
test <- "I am having a good time goodnight" 
for (i in 1:length(goodwords.corpus)){ 
    test <-gsub(paste0('\\<', goodwords.corpus[[i]], '\\>'), paste(goodwords.corpus[[i]], "1234"), test) 
} 
test 
# [1] "I am having a good 1234 time goodnight" 

paste0仅仅是paste(..., sep='')

(我张贴此同时@MatthewLundberg,他也是正确的。实际上,我更熟悉如何使用\b\<,但我认为我会继续使用你的代码。)

+0

谢谢!我在查看这个页面之前就已经意识到了 – user2303557

9

使用\b指示字边界:

> text <- "good night goodnight" 
> gsub("\\bgood\\b", paste("good", 1234), text) 
[1] "good 1234 night goodnight" 

在你的循环,这样的事情:

for (word in goodwords.corpus){ 
    patt <- paste0('\\b', word, '\\b') 
    repl <- paste(word, "1234") 

    test <-gsub(patt, repl, test) 
} 
+0

这工作完美。 –