Antworten:
Mir ist nichts in Basis R bekannt, aber es ist einfach, eine Funktion zu erstellen, um dies mit substr
und zu tun nchar
:
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 betont. Erwägen:
x <- c("some text in a string", "I really need to learn how to count")
substrRight(x, 6)
[1] "string" " count"
nchar(x)
doppelten Aufruf zu vermeiden, indem Sie ihn einer lokalen Variablen zuweisen?
Wenn es Ihnen nichts ausmacht, das stringr
Paket zu verwenden, str_sub
ist dies praktisch, da Sie Negative verwenden können, um rückwärts zu zählen:
x <- "some text in a string"
str_sub(x,-6,-1)
[1] "string"
Oder, wie Max in einem Kommentar zu dieser Antwort betont,
str_sub(x, start= -6)
[1] "string"
stringr
es wurde stringi
als Backend neu erstellt, sollte also jetzt mit NAs usw. funktionieren.
Verwenden Sie die stri_sub
Funktion aus dem stringi
Paket. Verwenden Sie negative Zahlen, um die Teilzeichenfolge vom Ende zu erhalten. Schauen Sie sich unten die Beispiele an:
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. Geben Sie einfach ein
install.packages("stringi")
um dieses Paket zu installieren.
Eine andere ziemlich einfache Möglichkeit ist die Verwendung regulärer Ausdrücke und sub
:
sub('.*(?=.$)', '', string, perl=T)
Also, "alles loswerden, gefolgt von einem Charakter". Fügen Sie der Lookahead-Behauptung jedoch so viele Punkte hinzu, um am Ende mehr Zeichen zu erhalten:
sub('.*(?=.{2}$)', '', string, perl=T)
wo .{2}
bedeutet ..
, oder "zwei beliebige Zeichen", was bedeutet "alles loswerden, 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, aber Sie müssen paste
den Variablenwert in die Zeichenfolge für reguläre Ausdrücke eingeben:
n = 3
sub(paste('.+(?=.{', n, '})', sep=''), '', string, perl=T)
regmatches(x, regexpr(".{6}$", x))
UPDATE : Wie von mdsumner festgestellt , ist der ursprüngliche Code bereits vektorisiert, da substr ist. Hätte vorsichtiger sein sollen.
Und wenn Sie eine vektorisierte Version möchten (basierend auf Andries 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 geändert (nchar(x)-n)
habe (nchar(x)-n+1)
, um n
Zeichen zu erhalten .
(nchar(x)-n)
zu (nchar(x)-n+1)
"
Eine einfache Basis-R-Lösung mit der substring()
Funktion (wer wusste, dass diese Funktion überhaupt existiert?):
RIGHT = function(x,n){
substring(x,nchar(x)-n+1)
}
Dies nutzt den Vorteil, im Grunde genommen substr()
darunter zu sein, hat aber einen Standardendwert von 1.000.000.
Beispiele:
> RIGHT('Hello World!',2)
[1] "d!"
> RIGHT('Hello World!',8)
[1] "o World!"
Eine Alternative dazu 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 substr
auch, aber auf eine andere Art und Weise. Ich möchte die letzten 6 Zeichen von "Gib mir dein Essen" extrahieren. Hier sind die Schritte:
(1) Teilen Sie die Zeichen
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 zugegriffen werden splits[[1]][x]
, wobei x 1 bis 6 ist.
Jemand zuvor verwendet eine ähnliche Lösung wie ich, aber ich finde es einfacher, wie folgt 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))
Dadurch werden die letzten Zeichen wie gewünscht angezeigt.
Ich habe den folgenden Code verwendet, um das letzte Zeichen einer Zeichenfolge abzurufen.
substr(output, nchar(stringOfInterest), nchar(stringOfInterest))
Sie können mit dem nchar (stringOfInterest) spielen, um herauszufinden, wie Sie die letzten Zeichen erhalten.
Eine kleine Modifikation der @ Andrea-Lösung bietet 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 habe. Und es lädt zur linken Seite ein:
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"