Entfernen Sie einen Teil einer Zeichenfolge


88

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

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


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.


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"

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"

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

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"
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.