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

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.


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> 

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

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" 

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"

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" 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.