Extraire les n derniers caractères d’une chaîne dans R

Comment puis-je obtenir les n derniers caractères d’une chaîne dans R? Existe-t-il une fonction comme SQL RIGHT?

Je ne suis pas au courant de quoi que ce soit dans la base R, mais il est facile de faire cela avec substr et 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" 

Ceci est vectorisé, comme le souligne @mdsumner. Considérer:

 x <- c("some text in a string", "I really need to learn how to count") substrRight(x, 6) [1] "string" " count" 

Si cela ne vous dérange pas d’utiliser le paquet ssortingngr , str_sub est pratique car vous pouvez utiliser des négatifs pour compter en arrière:

 x <- "some text in a string" str_sub(x,-6,-1) [1] "string" 

Ou, comme le souligne Max dans un commentaire à cette réponse,

 str_sub(x, start= -6) [1] "ssortingng" 

Utilisez la fonction ssortingngi package ssortingngi . Pour obtenir la sous-chaîne de la fin, utilisez des nombres négatifs. Regardez ci-dessous les exemples:

 ssorting_sub("abcde",1,3) [1] "abc" ssorting_sub("abcde",1,1) [1] "a" ssorting_sub("abcde",-3,-1) [1] "cde" 

Vous pouvez installer ce paquet à partir de github: https://github.com/Rexamine/ssortingngi

Il est disponible sur CRAN maintenant, tapez simplement

 install.packages("ssortingngi") 

pour installer ce paquet

 str = 'This is an example' n = 7 result = substr(str,(nchar(str)+1)-n,nchar(str)) print(result) > [1] "example" > 

UPDATE : comme noté par mdsumner , le code original est déjà vectorisé car substr est. Aurait dû être plus prudent.

Et si vous voulez une version vectorisée (basée sur le code d’ Andrie )

 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" 

Notez que j’ai changé (nchar(x)-n) en (nchar(x)-n+1) pour obtenir n caractères.

Un autre moyen relativement simple consiste à utiliser des expressions régulières et des sub :

 sub('.*(?=.$)', '', ssortingng, perl=T) 

Donc, “se débarrasser de tout suivi d’un personnage”. Pour saisir plus de caractères à la fin, ajoutez autant de points dans l’assertion lookahead:

 sub('.*(?=.{2}$)', '', ssortingng, perl=T) 

.{2} signifie .. , ou “deux caractères”, ce qui signifie “se débarrasser de tout suivi de deux caractères”.

 sub('.*(?=.{3}$)', '', ssortingng, perl=T) 

pour trois caractères, etc. Vous pouvez définir le nombre de caractères à saisir avec une variable, mais vous devrez paste la valeur de la variable dans la chaîne d’expression régulière:

 n = 3 sub(paste('.+(?=.{', n, '})', sep=''), '', ssortingng, perl=T) 

Une alternative à substr est de diviser la chaîne en une liste de caractères uniques et de traiter les éléments suivants:

 N <- 2 sapply(strsplit(x, ""), function(x, n) paste(tail(x, n), collapse = ""), N) 

substr aussi substr , mais d’une manière différente. Je veux extraire les 6 derniers caractères de “Donne-moi ta nourriture”. Voici les étapes:

(1) Diviser les caractères

 splits <- strsplit("Give me your food.", split = "") 

(2) Extraire les 6 derniers caractères

 tail(splits[[1]], n=6) 

Sortie:

 [1] " " "f" "o" "o" "d" "." 

Chacun des caractères est accessible par des splits[[1]][x] , où x est compris entre 1 et 6.

Une solution simple de base R utilisant la fonction subssortingng() (qui savait que cette fonction existait même?):

 RIGHT = function(x,n){ subssortingng(x,nchar(x)-n+1) } 

Cela prend l’avantage d’être en fait un substr() dessous, mais a une valeur finale par défaut de 1 000 000.

Exemples:

 > RIGHT('Hello World!',2) [1] "d!" > RIGHT('Hello World!',8) [1] "o World!" 

Quelqu’un a déjà utilisé une solution similaire à la mienne, mais je trouve plus facile de penser comme ci-dessous:

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

Cela amènera les derniers caractères comme vous le souhaitez.

J’ai utilisé le code suivant pour obtenir le dernier caractère d’une chaîne.

  substr(output, nchar(ssortingngOfInterest), nchar(ssortingngOfInterest)) 

Vous pouvez jouer avec nchar (ssortingngOfInterest) pour savoir comment obtenir les derniers caractères.

Essaye ça:

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

Il devrait donner:

 [1] "ssortingng" 

Une petite modification sur la solution @Andrie donne également le complément:

 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" 

C'était ce que je cherchais. Et il invite à gauche:

 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" 

Juste au cas où une gamme de caractères doit être choisie:

 # For example, to get the date part from the ssortingng substrRightRange <- function(x, m, n){substr(x, nchar(x)-m+1, nchar(x)-m+n)} value <- "REGNDATE:20170526RN" substrRightRange(value, 10, 8) [1] "20170526"