Réponses:
Je ne suis au courant de rien dans la base R, mais il est simple de créer une fonction pour ce faire 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 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"
nchar(x)
deux fois en l'affectant à une variable locale?
Si cela ne vous dérange pas d'utiliser le stringr
package, str_sub
c'est pratique car vous pouvez utiliser des négatifs pour compter à rebours:
x <- "some text in a string"
str_sub(x,-6,-1)
[1] "string"
Ou, comme Max le fait remarquer dans un commentaire à cette réponse,
str_sub(x, start= -6)
[1] "string"
stringr
a été refait en utilisant stringi
un backend, donc devrait fonctionner avec les NA, etc. maintenant.
Utilisez la stri_sub
fonction du stringi
package. Pour obtenir la sous-chaîne 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")
pour installer ce package.
Une autre façon assez simple consiste à utiliser des expressions régulières et sub
:
sub('.*(?=.$)', '', string, perl=T)
Donc, "débarrassez-vous de tout suivi d'un seul personnage". Pour saisir plus de caractères à la fin, ajoutez autant de points dans l'assertion lookahead:
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 définir la paste
valeur de la variable dans la chaîne d'expression régulière:
n = 3
sub(paste('.+(?=.{', n, '})', sep=''), '', string, perl=T)
regmatches(x, regexpr(".{6}$", x))
MISE À JOUR : comme indiqué par mdsumner , le code d'origine est déjà vectorisé parce que substr l'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 je l' ai changé (nchar(x)-n)
pour (nchar(x)-n+1)
obtenir des n
caractères.
(nchar(x)-n)
à (nchar(x)-n+1)
"
Une solution de base R simple utilisant la substring()
fonction (qui savait que cette fonction existait même?):
RIGHT = function(x,n){
substring(x,nchar(x)-n+1)
}
Cela profite essentiellement d'être en 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!"
Une alternative à substr
est de diviser la chaîne en une liste de caractères uniques et de traiter ce qui:
N <- 2
sapply(strsplit(x, ""), function(x, n) paste(tail(x, n), collapse = ""), N)
J'utilise substr
aussi, mais d'une manière différente. Je veux extraire les 6 derniers caractères de "Donnez-moi votre nourriture." Voici les étapes:
(1) Divisez les caractères
splits <- strsplit("Give me your food.", split = "")
(2) Extraire les 6 derniers caractères
tail(splits[[1]], n=6)
Production:
[1] " " "f" "o" "o" "d" "."
Chacun des personnages est accessible par splits[[1]][x]
, où x est compris entre 1 et 6.
quelqu'un utilise avant 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.
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 le nchar (stringOfInterest) pour comprendre comment obtenir les derniers caractères.
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"
Voilà ce que je cherchais. Et il 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"