2012-06-22 11 views
9

Vorrei implementare una funzione con R che rimuove i caratteri ripetuti in una stringa. Per esempio, dire la mia funzione è denominata removeRS, quindi dovrebbe funzionare in questo modo:Come posso rimuovere i caratteri ripetuti in una stringa con R?

removeRS('Buenaaaaaaaaa Suerrrrte') 
    Buena Suerte 
    removeRS('Hoy estoy tristeeeeeee') 
    Hoy estoy triste 

mia funzione sta per essere usato con le stringhe scritte in spagnolo, quindi non è che il comune (o almeno corretta) per trovare parole che hanno più di tre vocali successive. Non preoccupatevi del possibile sentimento dietro di loro. Nondimeno, ci sono parole che possono avere due consonanti successive (specialmente ll e rr), ma potremmo saltare questo dalla nostra funzione.

Quindi, per riassumere, questa funzione dovrebbe sostituire le lettere che compaiono almeno tre volte di fila con solo quella lettera. In uno degli esempi sopra, aaaaaaaaa viene sostituito con a.

Potrebbe darmi qualche suggerimento per svolgere questa attività con R?

+0

"Questa attività" non è attualmente specificata in modo chiaro. Trailing vocali ripetute potrebbe essere necessario gestire diversamente, ma questo non è chiaro dalla descrizione. –

risposta

19

non ho pensato molto attentamente su questo, ma questa è la mia soluzione rapida ai riferimenti indicati nella espressioni regolari :

gsub('([[:alpha:]])\\1+', '\\1', 'Buenaaaaaaaaa Suerrrrte') 
# [1] "Buena Suerte" 

() cattura la lettera prima, \\1 riferisce a quella lettera, + mezzi per abbinare una o più; Metti insieme tutti questi pezzi, possiamo abbinare una lettera due o più volte.

Per includere altri caratteri oltre ai caratteri alfanumerici, sostituire [[:alpha:]] con una espressione regolare che corrisponda a ciò che si desidera includere.

+1

Grazie, e se vuoi escludere alcune lettere da questo? Ad esempio, escludi le lettere L e R. – Nestorghh

+0

'[: alpha:]' significa 'a-zA-Z'; se vuoi essere specifico, puoi dire, ad es. '[a-zA-KM-QS-Z]' per rimuovere lettere maiuscole L e R; vedere '? regexp' –

+0

Ecco una variazione usando un'espressione regolare di lookahead di zero perl stile:' gsub ("([[: alpha:]]) (? = \\ 1)", "", s, perl = TRUE) '. Corrisponde a tutto tranne l'ultimo in qualsiasi sequenza di caratteri alfabetici. –

5

Penso che dovresti prestare attenzione alle ambiguità nella descrizione del problema. Si tratta di un primo tentativo, ma chiaramente non funziona con "buona fortuna" nel modo che desiderate:

removeRS <- function(str) paste(rle(strsplit(str, "")[[1]])$values, collapse="") 
removeRS('Buenaaaaaaaaa Suerrrrte') 
#[1] "Buena Suerte" 
+0

Grazie per la tua risposta @DWin. L'esempio con "Good Luck" non mi infastidisce affatto e accetto e mi scuso per le ambiguità. Le cose in inglese non funzionano come in spagnolo in questo senso. Ho provato la tua soluzione e funziona come desidero. A proposito, ho modificato la domanda per renderla più chiara. – Nestorghh

0

Dal momento che si desidera sostituire le lettere che appaiono almeno 3 volte, ecco la mia soluzione:

gsub("([[:alpha:]])\\1{2,}", "\\1", "Buennaaaa Suerrrtee") 
#[1] "Buenna Suertee" 

Come si può vedere la 4 "a" sono stati ridotti a solo 1 a, 3 r hanno stato ridotto a 1 r ma il 2 n e il 2 e non sono stati modificati. Come suggerito sopra è possibile sostituire il [[:alpha:]] da qualsiasi combinazione di [a-zA-KM-Z] o simili, e persino utilizzare la "o" operatore | all'interno delle parentesi squre [y|Q] se si desidera che il codice per influenzare solo ripetizioni di y e Q.

gsub("([a|e])\\1{2,}", "\\1", "Buennaaaa Suerrrtee") 
# [1] "Buenna Suerrrtee" 
# triple r are not affected and there are no triple e. 
Problemi correlati