Comment obtenir les n derniers caractères d'une chaîne dans R?
Je ne suis au courant de rien en base R, mais il est tout à fait simple de créer une fonction permettant de faire cela en utilisant 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 fait remarquer @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 le fait d'utiliser le package stringr
ne vous dérange pas, 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] "string"
Utilisez la fonction stri_sub
de stringi
package . Pour obtenir une sous-chaîne à partir de la fin, utilisez des nombres négatifs . Regardez ci-dessous pour les exemples:
stri_sub("abcde",1,3)
[1] "abc"
stri_sub("abcde",1,1)
[1] "a"
stri_sub("abcde",-3,-1)
[1] "cde"
Vous pouvez installer ce paquet depuis github: https://github.com/Rexamine/stringi
Il est disponible sur CRAN maintenant, tapez simplement
install.packages("stringi")
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 indiqué 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 de 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 des caractères n
.
Une autre méthode relativement simple consiste à utiliser des expressions régulières et sub
:
sub('.*(?=.$)', '', string, Perl=T)
Alors, "se débarrasser de tout suivi d'un caractère". Pour attraper plus de caractères à la fin, ajoutez le nombre de points dans l'affirmation d'anticipation:
sub('.*(?=.{2}$)', '', string, Perl=T)
où .{2}
signifie ..
ou "deux caractères quelconques", ce qui signifie "se débarrasser de tout suivi de deux caractères".
sub('.*(?=.{3}$)', '', string, 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=''), '', string, Perl=T)
Une solution de base R simple utilisant la fonction substring()
(qui savait que cette fonction existait même?):
RIGHT = function(x,n){
substring(x,nchar(x)-n+1)
}
Cela tire parti du fait que substr()
est en dessous mais que sa valeur finale par défaut est de 1 000 000.
Exemples:
> RIGHT('Hello World!',2)
[1] "d!"
> RIGHT('Hello World!',8)
[1] "o World!"
Une alternative à substr
consiste à scinder la chaîne en une liste de caractères simples et à traiter ce qui suit:
N <- 2
sapply(strsplit(x, ""), function(x, n) paste(tail(x, n), collapse = ""), N)
J'utilise 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 personnages
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 splits[[1]][x]
, où x est compris entre 1 et 6.
quelqu'un auparavant utilise 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 apportera les derniers caractères comme vous le souhaitez.
Essaye ça:
x <- "some text in a string"
n <- 5
substr(x, nchar(x)-n, nchar(x))
Cela devrait donner:
[1] "string"
J'ai utilisé le code suivant pour obtenir le dernier caractère d'une chaîne.
substr(output, nchar(stringOfInterest), nchar(stringOfInterest))
Vous pouvez jouer avec nchar (stringOfInterest) pour comprendre comment récupérer les derniers caractères.
Juste au cas où il faudrait choisir une série de caractères:
# 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"
Une petite modification sur la solution @Andrie donne aussi 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 cela invite sur le côté 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"