2014-04-06 57 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

這工作完美。 –