Antworten:
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 ?regex
für weitere Informationen und Referenzen
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.
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"
Hier ist die strsplit
Lösung, wenn s
es 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"
Hier die strsplit
Lösung für einen Datenrahmen mit dplyr
Paket
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
Die vielleicht intuitivste Lösung besteht wahrscheinlich darin, die stringr
Funktion zu verwenden, str_remove
die noch einfacher ist, als str_replace
da 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"
gsub("^.*_","_","ATGAS_1121_xxx")
. Jetzt behoben.