Entfernen Sie einen Teil einer Zeichenfolge

88

Wie entferne ich einen Teil einer Zeichenfolge? Zum Beispiel in ATGAS_1121Ich möchte alles vorher entfernen _.

Lisann
quelle

Antworten:

130

Verwenden Sie reguläre Ausdrücke. In diesem Fall können Sie Folgendes verwenden gsub:

gsub("^.*?_","_","ATGAS_1121")
[1] "_1121"

Dieser reguläre Ausdruck entspricht dem Anfang der Zeichenfolge (^), einem beliebigen Zeichen (.), Das null oder mehrmals wiederholt wird (*), und einem Unterstrich (_). Das ? macht das Match "faul", so dass nur Matches bis zum ersten Unterstrich reichen. Dieses Match wird nur durch einen Unterstrich ersetzt. Sehen Sie ?regexfür weitere Informationen und Referenzen

Joshua Ulrich
quelle
6
Der vorherige reguläre Ausdruck würde mit dem letzten Unterstrich übereinstimmen, wenn z gsub("^.*_","_","ATGAS_1121_xxx"). Jetzt behoben.
Richie Cotton
6
@ Joshua Ich finde es wirklich nützlich, dass Sie die Rolle der regulären Ausdrücke erklärt haben.
Vasile
Dies funktioniert auch mit einem Vektor von Zeichenfolgen als letztem Argument. R ist so großartig.
naught101
36

Sie können hierfür eine integrierte Funktion verwenden, strsplit :

> s = "TGAS_1121"
> s1 = unlist(strsplit(s, split='_', fixed=TRUE))[2]
> s1    
 [1] "1121"

strsplit gibt beide Teile des Strings, die im split- Parameter analysiert wurden, als Liste zurück . Das ist wahrscheinlich nicht das, was Sie wollen. Schließen Sie den Aufruf in die Liste ein und indizieren Sie das Array so, dass nur das zweite der beiden Elemente im Vektor zurückgegeben wird.

Schließlich sollte der feste Parameter auf TRUE gesetzt werden, um anzuzeigen, dass der Split-Parameter kein regulärer Ausdruck, sondern ein Literal-Matching-Zeichen ist.

Doug
quelle
22

Wenn Sie eine Tidyverse-Person sind, ist hier die Stringr- Lösung:

R> library(stringr)
R> strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121") 
R> strings %>% str_replace(".*_", "_")
[1] "_1121" "_1432" "_1121"
# Or:
R> strings %>% str_replace("^[A-Z]*", "")
[1] "_1121" "_1432" "_1121"
naught101
quelle
21

Hier ist die strsplitLösung, wenn ses sich um einen Vektor handelt:

> s <- c("TGAS_1121", "MGAS_1432")
> s1 <- sapply(strsplit(s, split='_', fixed=TRUE), function(x) (x[2]))
> s1
[1] "1121" "1432"
verbamour
quelle
2
Sehr hilfreich, danke! Zu Ihrer Information, um den ersten Teil der Zeichenfolge (dh vor dem '_') zu erhalten, ersetzen Sie die [2] am Ende durch eine [1].
Stevenjoe
3

Hier die strsplitLösung für einen Datenrahmen mit dplyrPaket

col1 = c("TGAS_1121", "MGAS_1432", "ATGAS_1121") 
col2 = c("T", "M", "A") 
df = data.frame(col1, col2)
df
        col1 col2
1  TGAS_1121    T
2  MGAS_1432    M
3 ATGAS_1121    A

df<-mutate(df,col1=as.character(col1))
df2<-mutate(df,col1=sapply(strsplit(df$col1, split='_', fixed=TRUE),function(x) (x[2])))
df2

  col1 col2
1 1121    T
2 1432    M
3 1121    A
KK_63
quelle
3

Die vielleicht intuitivste Lösung besteht wahrscheinlich darin, die stringrFunktion zu verwenden, str_removedie noch einfacher ist, als str_replaceda sie nur 1 Argument anstelle von 2 hat.

Der einzige schwierige Teil in Ihrem Beispiel ist, dass Sie den Unterstrich beibehalten möchten, aber es ist möglich: Sie müssen mit dem regulären Ausdruck übereinstimmen, bis das angegebene Zeichenfolgenmuster gefunden wird (?=pattern).

Siehe Beispiel:

strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121")
strings %>% stringr::str_remove(".+?(?=_)")

[1] "_1121" "_1432" "_1121"
Agile Bohne
quelle