wake-up-neo.net

Extrahieren der letzten n Zeichen aus einer Zeichenfolge in R

Wie kann ich die letzten n Zeichen aus einer Zeichenfolge in R erhalten? Gibt es eine Funktion wie das Recht von SQL?

223
Brani

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"
240
Andrie

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"
155
Xu Wang

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.

39
bartektartanus
str = 'This is an example'
n = 7
result = substr(str,(nchar(str)+1)-n,nchar(str))
print(result)

> [1] "example"
> 
20
Andrew

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.

10
Laurent

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)
8
dsb

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!"
6
Andrew Haynes

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)
6
mdsumner

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.

4
Raimi bin Karim

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.

3
JP Fonseca

Versuche dies:

x <- "some text in a string"
n <- 5
substr(x, nchar(x)-n, nchar(x))

Es sollte geben:

[1] "string"
2
lukasz

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.

1
Anurag Mishra

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"
0
RanonKahn

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"
0
xm1