Wie kann ich die letzten n Zeichen aus einer Zeichenfolge in R erhalten? Gibt es eine Funktion wie das Recht von SQL?
Mir ist nichts in der Basis R bekannt, aber es ist unkompliziert, eine Funktion zu erstellen, die substr
und nchar
verwendet:
x <- "some text in a string"
substrRight <- function(x, n){
substr(x, nchar(x)-n+1, nchar(x))
}
substrRight(x, 6)
[1] "string"
substrRight(x, 8)
[1] "a string"
Dies ist vektorisiert, wie @mdsumner feststellt. Erwägen:
x <- c("some text in a string", "I really need to learn how to count")
substrRight(x, 6)
[1] "string" " count"
Wenn Sie nichts dagegen haben, das Paket stringr
zu verwenden, ist str_sub
praktisch, da Sie Negative zum Rückwärtszählen verwenden können:
x <- "some text in a string"
str_sub(x,-6,-1)
[1] "string"
Oder wie Max in einem Kommentar zu dieser Antwort darauf hinweist,
str_sub(x, start= -6)
[1] "string"
Verwenden Sie die stri_sub
-Funktion aus dem stringi
-Paket . Verwenden Sie negative Zahlen ..__, um die Teilzeichenfolge am Ende zu erhalten.
stri_sub("abcde",1,3)
[1] "abc"
stri_sub("abcde",1,1)
[1] "a"
stri_sub("abcde",-3,-1)
[1] "cde"
Sie können dieses Paket von github installieren: https://github.com/Rexamine/stringi
Es ist jetzt auf CRAN verfügbar, einfach tippen
install.packages("stringi")
um dieses Paket zu installieren.
str = 'This is an example'
n = 7
result = substr(str,(nchar(str)+1)-n,nchar(str))
print(result)
> [1] "example"
>
UPDATE: Wie von mdsumner angegeben, ist der ursprüngliche Code bereits vektorisiert, weil substr ist. Sollte vorsichtiger sein.
Und wenn Sie eine vektorisierte Version wünschen (basierend auf Andrie s Code)
substrRight <- function(x, n){
sapply(x, function(xx)
substr(xx, (nchar(xx)-n+1), nchar(xx))
)
}
> substrRight(c("12345","ABCDE"),2)
12345 ABCDE
"45" "DE"
Beachten Sie, dass ich (nchar(x)-n)
in (nchar(x)-n+1)
geändert habe, um n
-Zeichen zu erhalten.
Eine andere einfache Möglichkeit ist die Verwendung regulärer Ausdrücke und sub
:
sub('.*(?=.$)', '', string, Perl=T)
"Alles los, gefolgt von einem Zeichen". Fügen Sie der Lookahead-Assertion jedoch viele Punkte hinzu, um weitere Charaktere vom Ende zu erfassen:
sub('.*(?=.{2}$)', '', string, Perl=T)
dabei bedeutet .{2}
..
oder "zwei beliebige Zeichen", also "alles loslassen, gefolgt von zwei Zeichen".
sub('.*(?=.{3}$)', '', string, Perl=T)
für drei Zeichen usw. Sie können die Anzahl der Zeichen festlegen, die mit einer Variablen erfasst werden sollen. Sie müssen jedoch den Variablenwert paste
in den regulären Ausdruck eingeben:
n = 3
sub(paste('.+(?=.{', n, '})', sep=''), '', string, Perl=T)
Eine einfache Basis-R-Lösung, die die Funktion substring()
verwendet (wer wusste, dass diese Funktion überhaupt existierte?):
RIGHT = function(x,n){
substring(x,nchar(x)-n+1)
}
Dies nutzt den Vorteil, dass substr()
im Grunde darunter ist, hat jedoch einen voreingestellten Endwert von 1.000.000.
Beispiele:
> RIGHT('Hello World!',2)
[1] "d!"
> RIGHT('Hello World!',8)
[1] "o World!"
Eine Alternative zu substr
besteht darin, die Zeichenfolge in eine Liste einzelner Zeichen aufzuteilen und Folgendes zu verarbeiten:
N <- 2
sapply(strsplit(x, ""), function(x, n) paste(tail(x, n), collapse = ""), N)
Ich benutze auch substr
, aber auf andere Weise. Ich möchte die letzten 6 Zeichen von "Gib mir dein Essen" extrahieren. Hier sind die Schritte:
(1) Teilen Sie die Zeichen auf
splits <- strsplit("Give me your food.", split = "")
(2) Extrahieren Sie die letzten 6 Zeichen
tail(splits[[1]], n=6)
Ausgabe:
[1] " " "f" "o" "o" "d" "."
Auf jedes der Zeichen kann mit splits[[1]][x]
zugegriffen werden, wobei x 1 bis 6 ist.
jemand verwendet eine ähnliche Lösung wie meine, aber ich finde es einfacher, als unten zu denken:
> text<-"some text in a string" # we want to have only the last Word "string" with 6 letter
> n<-5 #as the last character will be counted with nchar(), here we discount 1
> substr(x=text,start=nchar(text)-n,stop=nchar(text))
Dies bringt die letzten Zeichen wie gewünscht.
Versuche dies:
x <- "some text in a string"
n <- 5
substr(x, nchar(x)-n, nchar(x))
Es sollte geben:
[1] "string"
Ich habe den folgenden Code verwendet, um das letzte Zeichen einer Zeichenfolge zu erhalten.
substr(output, nchar(stringOfInterest), nchar(stringOfInterest))
Sie können mit nchar (stringOfInterest) spielen, um herauszufinden, wie Sie die letzten Zeichen erhalten.
Nur für den Fall, dass eine Reihe von Zeichen ausgewählt werden muss:
# For example, to get the date part from the string
substrRightRange <- function(x, m, n){substr(x, nchar(x)-m+1, nchar(x)-m+n)}
value <- "REGNDATE:20170526RN"
substrRightRange(value, 10, 8)
[1] "20170526"
Eine kleine Modifikation an der @Andrie-Lösung gibt auch die Ergänzung:
substrR <- function(x, n) {
if(n > 0) substr(x, (nchar(x)-n+1), nchar(x)) else substr(x, 1, (nchar(x)+n))
}
x <- "moSvmC20F.5.rda"
substrR(x,-4)
[1] "moSvmC20F.5"
Das war es, wonach ich gesucht hatte. Und es lädt zur linken Seite:
substrL <- function(x, n){
if(n > 0) substr(x, 1, n) else substr(x, -n+1, nchar(x))
}
substrL(substrR(x,-4),-2)
[1] "SvmC20F.5"