Respuestas:
No conozco nada en la base R, pero es sencillo hacer una función para hacer esto usando substr
y 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"
Esto está vectorizado, como señala @mdsumner. Considerar:
x <- c("some text in a string", "I really need to learn how to count")
substrRight(x, 6)
[1] "string" " count"
nchar(x)
dos veces asignándolo a una variable local?
Si no te importa usar el stringr
paquete, str_sub
es útil porque puedes usar negativos para contar hacia atrás:
x <- "some text in a string"
str_sub(x,-6,-1)
[1] "string"
O, como Max señala en un comentario a esta respuesta,
str_sub(x, start= -6)
[1] "string"
stringr
había rehecho utilizando stringi
como back-end, por lo que debería funcionar con NA, etc.
Usar la stri_sub
función del stringi
paquete. Para obtener una subcadena desde el final, use números negativos. Mira a continuación los ejemplos:
stri_sub("abcde",1,3)
[1] "abc"
stri_sub("abcde",1,1)
[1] "a"
stri_sub("abcde",-3,-1)
[1] "cde"
Puede instalar este paquete desde github: https://github.com/Rexamine/stringi
Ya está disponible en CRAN, simplemente escriba
install.packages("stringi")
para instalar este paquete
Otra forma razonablemente sencilla es usar expresiones regulares y sub
:
sub('.*(?=.$)', '', string, perl=T)
Entonces, "deshazte de todo seguido de un personaje". Para capturar más caracteres al final, agregue cuantos puntos haya en la afirmación anticipada:
sub('.*(?=.{2}$)', '', string, perl=T)
donde .{2}
significa ..
, o "cualquier dos caracteres", lo que significa "deshacerse de todo seguido de dos caracteres".
sub('.*(?=.{3}$)', '', string, perl=T)
para tres caracteres, etc. Puede establecer el número de caracteres para capturar con una variable, pero deberá paste
ingresar el valor de la variable en la cadena de expresión regular:
n = 3
sub(paste('.+(?=.{', n, '})', sep=''), '', string, perl=T)
regmatches(x, regexpr(".{6}$", x))
ACTUALIZACIÓN : como lo señaló mdsumner , el código original ya está vectorizado porque substr lo es. Debería haber sido más cuidadoso.
Y si quieres una versión vectorizada (basada en el código 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"
Tenga en cuenta que he cambiado (nchar(x)-n)
a (nchar(x)-n+1)
para obtener n
personajes.
(nchar(x)-n)
a (nchar(x)-n+1)
"
Una solución base R simple que usa la substring()
función (¿quién sabía que esta función existía?):
RIGHT = function(x,n){
substring(x,nchar(x)-n+1)
}
Esto aprovecha básicamente ser substr()
debajo pero tiene un valor final predeterminado de 1,000,000.
Ejemplos:
> RIGHT('Hello World!',2)
[1] "d!"
> RIGHT('Hello World!',8)
[1] "o World!"
Una alternativa substr
es dividir la cadena en una lista de caracteres individuales y procesar eso:
N <- 2
sapply(strsplit(x, ""), function(x, n) paste(tail(x, n), collapse = ""), N)
Yo substr
también lo uso , pero de una manera diferente. Quiero extraer los últimos 6 caracteres de "Dame tu comida". Aquí están los pasos:
(1) Divide los personajes
splits <- strsplit("Give me your food.", split = "")
(2) Extraiga los últimos 6 caracteres.
tail(splits[[1]], n=6)
Salida:
[1] " " "f" "o" "o" "d" "."
Se puede acceder a cada uno de los caracteres splits[[1]][x]
, donde x es de 1 a 6.
alguien antes usa una solución similar a la mía, pero me resulta más fácil pensar de la siguiente manera:
> 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))
Esto traerá los últimos caracteres como se desee.
Usé el siguiente código para obtener el último carácter de una cadena.
substr(output, nchar(stringOfInterest), nchar(stringOfInterest))
Puedes jugar con el nchar (stringOfInterest) para descubrir cómo obtener los últimos caracteres.
Una pequeña modificación en la solución @Andrie también da el complemento:
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"
Eso era lo que estaba buscando. E invita al lado izquierdo:
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"