Sostituisci caratteri specifici all'interno di stringhe


262

Vorrei rimuovere caratteri specifici dalle stringhe all'interno di un vettore, simile alla funzionalità Trova e sostituisci in Excel.

Ecco i dati con cui inizio:

group <- data.frame(c("12357e", "12575e", "197e18", "e18947")

Comincio con solo la prima colonna; Voglio produrre la seconda colonna rimuovendo il e:

group       group.no.e
12357e      12357
12575e      12575
197e18      19718
e18947      18947

Risposte:


399

Con un'espressione regolare e la funzione gsub():

group <- c("12357e", "12575e", "197e18", "e18947")
group
[1] "12357e" "12575e" "197e18" "e18947"

gsub("e", "", group)
[1] "12357" "12575" "19718" "18947"

Ciò che gsubfa qui è sostituire ogni occorrenza di "e"con una stringa vuota "".


Vedi ?regexpo gsubper ulteriori informazioni.


15
fixed = TRUErenderebbe questo più veloce.
Rich Scriven

4
@RichScriven potresti spiegare brevemente perché?
Glaed,

6
fixed=TRUEimpedisce a R di utilizzare espressioni regolari, che consentono una corrispondenza più flessibile dei modelli ma richiedono tempo per il calcolo. Se tutto ciò che serve è rimuovere una singola stringa costante "e", non sono necessari.
mm689

Avrebbe sub("e", "", group)lo stesso risultato?
Matheus Santana,

sostituirebbe solo il primo eche trova in ogni elemento
sindri_baldur il

47

Le espressioni regolari sono i tuoi amici:

R> ## also adds missing ')' and sets column name
R> group<-data.frame(group=c("12357e", "12575e", "197e18", "e18947"))  )
R> group
   group
1 12357e
2 12575e
3 197e18
4 e18947

Ora usa gsub()con il modello di sostituzione più semplice possibile: stringa vuota:

R> group$groupNoE <- gsub("e", "", group$group)
R> group
   group groupNoE
1 12357e    12357
2 12575e    12575
3 197e18    19718
4 e18947    18947
R> 

3
Anche ...require(stringr);group$groupNoE <- str_replace(group$group, "e", "")
dickoa,

26
Bene, potrei ridacchiare che "Coloro che non capiscono le funzioni di base sono condannati a sostituirle". Cosa guadagna esattamente qui, oltre ad aumentare il numero di caratteri di sottolineatura nel file sorgente?
Dirk Eddelbuettel,

8
" stringr è un insieme di semplici wrapper che rendono le funzioni di stringa di R più coerenti, più semplici e più facili da usare " dall'autore del pacchetto. Quindi, se ciò che dici è vero (molti caratteri di sottolineatura per avvolgere le funzioni di base ...) non c'è motivo per l'esistenza di questo pacchetto (dichiarazione di non responsabilità: utilizzo principalmente le funzioni di regex di base ma so che possono essere difficili per i nuovi utenti ... )
dickoa,

17
@dickoa: str_replaceavvolge sub, quindi sostituirà solo la prima occorrenza del modello. Dovresti usare str_replace_allse volessi lo stesso comportamento di gsub.
Joshua Ulrich,

24

Riassumendo 2 modi per sostituire le stringhe:

group<-data.frame(group=c("12357e", "12575e", "197e18", "e18947"))

1) Usa gsub

group$group.no.e <- gsub("e", "", group$group)

2) Utilizzare il stringrpacchetto

group$group.no.e <- str_replace_all(group$group, "e", "")

Entrambi produrranno l'output desiderato:

   group group.no.e
1 12357e      12357
2 12575e      12575
3 197e18      19718
4 e18947      18947

3
All'epoca dovevi leggere l'intera pagina, inclusi i commenti, per imparare la sintassi di stringr, il mio metodo preferito, come è stato principalmente discusso nei commenti. Questa soluzione presenta rapidamente entrambe le opzioni, motivo per cui l'ho offerta. La mia speranza era di aiutare gli altri utenti a filtrare molto come dovevo fare quando ero nuovo in R. Ho lottato con gsub prima di trovare stringr perché non era menzionato in una risposta molto votata. Ancora una volta, l'obiettivo non è quello di raccogliere voti, ma cercare di aiutare i nuovi utenti R.
Megatron

Se trovi informazioni in altre risposte / commenti che ritieni utili e che desideri convertire in una risposta, potresti almeno fornire qualche attribuzione per mostrare da dove hai ottenuto le informazioni / rendere la risposta un Wiki Comminuty invece di trasformarla in il tuo.
David Arenburg,

Grazie - lo terrò a mente per la prossima volta. Non ho mai creato un wiki della comunità prima, quindi non sapevo che fosse un'opzione.
Megatron,

1
L'opzione 2 funziona alla grande se applicata a una colonna di dati in un frame di dati, senza specificare tutti i valori nella colonna. Ovviamente l'opzione 1 è una ripetizione, ma l'opzione 2 funziona molto bene e merita un voto positivo per la funzionalità aggiunta.
Phil_T,

6

Non è necessario creare un frame di dati dal vettore di stringhe, se si desidera sostituire alcuni caratteri al suo interno. Le espressioni regolari sono una buona scelta perché sono già state menzionate da @Andrie e @Dirk Eddelbuettel.

Prestare attenzione, se si desidera sostituire caratteri speciali, come i punti, è necessario utilizzare la sintassi delle espressioni regolari complete, come mostrato nell'esempio seguente:

ctr_names <- c("Czech.Republic","New.Zealand","Great.Britain")
gsub("[.]", " ", ctr_names)

questo produrrà

[1] "Czech Republic" "New Zealand"    "Great Britain" 

Puoi semplicemente scappare da loro, ma devi scappare anche dal personaggio di fuga perché è tra virgolette:gsub("\\.", " ", ctr_names)
Kamil S Jaron,

4

Usa il pacchetto stringi :

require(stringi)

group<-data.frame(c("12357e", "12575e", "197e18", "e18947"))
stri_replace_all(group[,1], "", fixed="e")
[1] "12357" "12575" "19718" "18947"

0
      library(stringi)

            group <- c('12357e', '12575e', '12575e', ' 197e18',  'e18947')

            pattern <- "e"  
            replacement <-  ""  
            group <- str_replace(group, pattern, replacement)      
            group    

[1] "12357"  "12575"  "12575"  " 19718" "18947" 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.