2014-04-06 16 views
7

(Sto usando R.) Per un elenco di parole che si chiama "goodwords.corpus", eseguo il ciclo dei documenti in un corpo e sostituisco ciascuna delle parole nell'elenco "goodwords.corpus" con la parola + un numero.Fare in modo che gsub sostituisca solo parole intere?

Così, per esempio, se la parola "buono" è sulla lista, e "buona notte" non è nella lista, allora questo documento:

I am having a good time goodnight 

si trasformerebbe in:

I am having a good 1234 time goodnight 

** sto usando questo codice (EDIT- fatto questa riproducibile):

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) 
} 

Tuttavia, il problema è che voglio gsub soltanto sostituire l'intera wo RDS. Il problema che si pone è che: "buono" si trova nell'elenco "goodwords.corpus", ma anche "buonanotte", che NON è nell'elenco, è interessato. Così ottengo questo:

I am having a good 1234 time good 1234night 

C'è qualche cosa che posso dire gsub sostituire solo parole intere, e non le parole che potrebbero essere una parte di altre parole?

voglio usare questo:

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

Ho letto che il \ < e \> vi dirà gsub a guardare solo le parole intere. Ma ovviamente questo non funziona, perché goodwords.corpus [[i]] non funzionerà quando è tra virgolette.

Qualche suggerimento?

+0

Per favore riproduci il tuo esempio riproducibile: http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

+0

Sì. Per favore fallo. Hai un'opportunità qui. GG è un maestro riconosciuto di soluzioni regex. –

+0

Solo post originale modificato con codice riproducibile. Grazie mille!! – user2303557

risposta

7

Sei così vicino ad ottenere questo. Stai già utilizzando paste per formare la stringa sostitutiva, perché non utilizzarla per formare la stringa del modello?

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 è semplicemente paste(..., sep='').)

(ho postato questo stesso momento in cui @MatthewLundberg, e la sua è anche corretta. Sono davvero più familiarità con l'utilizzo di \b vizio \<, ma ho pensato Continuerò ad usare il tuo codice.)

+0

grazie! ho appena capito questo prima di controllare questa pagina. – user2303557

9

Usa \b per indicare un limite di parola:

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

Nel vostro ciclo, qualcosa di simile:

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

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

Questo ha funzionato perfettamente. –

Problemi correlati