2017-08-17 1 views
1

funktioniert habe ich eine Daten wie dieseMutate Zeilen basierend auf Bearbeitungs in Strings Benutzer definiert, die universell

clas=c("CD_1","X.2_2","K$2_3","12k3_4",".A_5","xy_6") 
df <- data.frame(clas) 
> df 
    clas 
1 CD_1 
2 X.2_2 
3 K$2_3 
4 12k3_4 
5 .A_5 
6 xy_6 

und ich möchte einige Zeilen ändern, dass diese Bedingung

wenn die Saiten nach _ übereinstimmen sind 4,5 und 6 ersetzen die Strings vor dem _ mit String B. Also sollte die Ausgabe so sein;

clas 
1 CD_1 
2 X.2_2 
3 K$2_3 
4 12kB_4 
5 .B_5 
6 xB_6 

Vielen Dank!

EDIT ::

SO Wenn ich Daten wie folgt aus:

clas 
1 CD_1 
2 X.2_2 
3 K$2_3 
4 12k3_4 
5 .A_5 
6 xy_11 

Ihre Lösung dann Anwendung,

df %>% mutate(clas = str_replace(clas, "(.)(_[4511])", "B\\2")) 

    clas 
1 CB_1 
2 X.2_2 
3 K$2_3 
4 12kB_4 
5 .B_5 
6 xB_11 

Aber ich will nur 11 nicht 1 übereinstimmen. Wie können wir das machen ?

Antwort

5
library(dplyr) 
library(stringr) 

clas <- c("CD_1","X.2_2","K$2_3","12k3_4",".A_5","xy_6") 
df <- data.frame(clas) 

df %>% mutate(clas = str_replace(clas, "(.)(_[456])", "B\\2")) 

hier das passende Muster setzen schafft ein Spiel mit 3 Gruppen, die erste enthält den gesamten Ausdruck durch ._[456], der zweite die . Teil und der dritte Teil mit dem enthält.

\\2 greift auf die dritte Gruppe (0 Indizierung) und so ersetzen Sie das gesamte Muster ._[456] mit B gefolgt von was auch immer abgestimmt wo [456] ein Zeichen in den Klammern eine der Optionen entspricht.

EDIT:

Jedes Zeichen innerhalb von [] wird individuell behandelt, so [1111] nicht von [1] anders ist, weil das Muster nur ein einzelnes Zeichen übereinstimmt, die entweder eine 1 oder 1 oder 1 oder 1 Stattdessen müssen Sie Verwenden Sie | so haben Sie (.)(_[45]|_11). Dies entspricht _4 oder _5 oder _11 in der zweiten Mustergruppe. Auch wenn Sie 1-9 aber nicht 11 oder 15 abgleichen möchten, müssen Sie (.)(_[45])$ verwenden, wobei $ der Indikator für das Ende der Zeichenfolge ist. Schauen Sie sich den Cheatsheet an und testen Sie diese unter RegExr.

+0

Danke für die Antwort und Erklärung. Nehmen wir an, wir haben mehr als drei Zahlen, nicht nur 4,5,6, wie wir das umsetzen? Zum Beispiel arbeitet seq (1,10) nicht innerhalb von '" (.) (_ [456]) "" Ich nehme an? – Alexander

+1

Nun, alle Optionen für den Abgleich sind innerhalb von '[]', so dass Sie '[123456789]' oder einfach '[1-9]' einfügen können. Schauen Sie sich diesen [Cheatsheet für reguläre Ausdrücke] (https://www.rstudio.com/wp-content/uploads/2016/09/RegExCheatsheet.pdf) an, der einzige knifflige Teil ist hier die Verwendung des '\\ 2 'Rückreferenz. – shians

+0

Ihre Lösung ist großartig, aber ich habe gerade ein kleines Problem im realen data.frame erkannt. Könntest du den EDIT-Teil des OPs überprüfen? – Alexander

Verwandte Themen