Ersetzen Sie bestimmte Zeichen innerhalb von Zeichenfolgen

262

Ich möchte bestimmte Zeichen aus Zeichenfolgen innerhalb eines Vektors entfernen, ähnlich der Funktion Suchen und Ersetzen in Excel.

Hier sind die Daten, mit denen ich beginne:

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

Ich beginne nur mit der ersten Spalte; Ich möchte die zweite Spalte erzeugen, indem ich die e's entferne :

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

Antworten:

399

Mit einem regulären Ausdruck und der Funktion gsub():

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

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

Was gsubhier tut , ist jedes Vorkommen zu ersetzen , "e"mit einem leeren String "".


Siehe ?regexpoder gsubfür weitere Hilfe.

Andrie
quelle
15
fixed = TRUEwürde das schneller machen.
Rich Scriven
4
@RichScriven könnten Sie kurz erläutern, warum?
Glaed
6
fixed=TRUEverhindert, dass R reguläre Ausdrücke verwendet, die einen flexibleren Mustervergleich ermöglichen, aber Zeit für die Berechnung benötigen. Wenn nur eine einzelne konstante Zeichenfolge "e" entfernt werden muss, sind sie nicht erforderlich.
mm689
Würde sub("e", "", group)das gleiche Ergebnis halten?
Matheus Santana
würde nur das erste ersetzen, das ees in jedem Element findet
sindri_baldur
47

Reguläre Ausdrücke sind deine Freunde:

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

Verwenden Sie jetzt gsub()mit dem einfachstmöglichen Ersatzmuster: leere Zeichenfolge:

R> group$groupNoE <- gsub("e", "", group$group)
R> group
   group groupNoE
1 12357e    12357
2 12575e    12575
3 197e18    19718
4 e18947    18947
R> 
Dirk Eddelbuettel
quelle
3
Auch ...require(stringr);group$groupNoE <- str_replace(group$group, "e", "")
Dickoa
26
Nun, ich könnte kichern, dass "diejenigen, die Basisfunktionen nicht verstehen, dazu verdammt sind, sie zu ersetzen". Was genau gewinnt stringr hier, außer die Anzahl der Unterstriche in Ihrer Quelldatei zu erhöhen?
Dirk Eddelbuettel
8
" stringr ist eine Reihe einfacher Wrapper, die die String-Funktionen von R konsistenter, einfacher und benutzerfreundlicher machen ", so der Autor des Pakets. Wenn also das, was Sie sagen, wahr ist (viele Unterstriche zum Umschließen von Basisfunktionen ...), gibt es keinen Grund für die Existenz dieses Pakets (Haftungsausschluss: Ich verwende hauptsächlich Regex-Basisfunktionen, aber ich weiß, dass sie für neue Benutzer schwierig sein können ... )
Dickoa
17
@dickoa: str_replaceWraps sub, so wird es nur ersetzen das erste Vorkommen des Musters. Sie müssten verwenden, str_replace_allwenn Sie das gleiche Verhalten wie möchten gsub.
Joshua Ulrich
24

2 Möglichkeiten zum Ersetzen von Zeichenfolgen zusammenfassen:

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

1) Verwenden gsub

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

2) Verwenden Sie das stringrPaket

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

Beide erzeugen die gewünschte Ausgabe:

   group group.no.e
1 12357e      12357
2 12575e      12575
3 197e18      19718
4 e18947      18947
Megatron
quelle
3
Zu der Zeit musste man die ganze Seite einschließlich der Kommentare lesen, um die Syntax für stringr zu lernen, meine bevorzugte Methode, da sie hauptsächlich in Kommentaren besprochen wurde. Diese Lösung bietet schnell beide Optionen, weshalb ich sie angeboten habe. Meine Hoffnung war es, anderen Benutzern dabei zu helfen, so zu filtern, wie ich es tun musste, als ich neu bei R war. Ich hatte Probleme mit gsub, bevor ich stringr fand, weil es in einer hoch bewerteten Antwort nicht erwähnt wurde. Auch hier besteht das Ziel nicht darin, Upvotes zu sammeln, sondern neuen R-Benutzern zu helfen.
Megatron
Wenn Sie Informationen in anderen Antworten / Kommentaren finden, die Sie nützlich finden und in eine Antwort konvertieren möchten, können Sie zumindest eine Zuordnung angeben, um zu zeigen, woher Sie die Informationen haben / die Antwort zu einem Comminuty-Wiki machen, anstatt sie nur als zu erstellen dein eigenes.
David Arenburg
Danke - werde für das nächste Mal im Auge behalten. Ich habe noch nie ein Community-Wiki erstellt und wusste daher nicht, dass dies eine Option ist.
Megatron
1
Option 2 funktioniert hervorragend, wenn sie auf eine Datenspalte in einem Datenrahmen angewendet wird, ohne alle Werte in der Spalte anzugeben. Natürlich ist Option 1 eine Wiederholung, aber Option 2 funktioniert sehr gut und verdient eine Aufwertung für die hinzugefügte Funktionalität.
Phil_T
6

Sie müssen keinen Datenrahmen aus einem Zeichenfolgenvektor erstellen, wenn Sie einige Zeichen darin ersetzen möchten. Reguläre Ausdrücke sind eine gute Wahl, da sie bereits von @Andrie und @Dirk Eddelbuettel erwähnt wurden.

Beachten Sie, dass Sie, wenn Sie Sonderzeichen wie Punkte ersetzen möchten, die vollständige Syntax für reguläre Ausdrücke verwenden sollten, wie im folgenden Beispiel gezeigt:

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

das wird produzieren

[1] "Czech Republic" "New Zealand"    "Great Britain" 
Alexander
quelle
Sie können ihnen einfach entkommen, aber Sie müssen auch dem Fluchtcharakter entkommen, weil es in Anführungszeichen steht:gsub("\\.", " ", ctr_names)
Kamil S Jaron
4

Verwenden Sie das Stringi- Paket:

require(stringi)

group<-data.frame(c("12357e", "12575e", "197e18", "e18947"))
stri_replace_all(group[,1], "", fixed="e")
[1] "12357" "12575" "19718" "18947"
MERose
quelle
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" 
Anya Sti
quelle