regulares manejo funcion expresiones ejemplos comodines comando caracteres cadenas r string substring

manejo - grep en r



Extraer los Ășltimos n caracteres de una cadena en R (14)

¿Cómo puedo obtener los últimos n caracteres de una cadena en R? ¿Existe una función como la DERECHA de SQL?


En caso de que sea necesario elegir un rango de caracteres:

# 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"


Otra forma razonablemente sencilla es usar expresiones regulares y sub :

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

Entonces, "deshazte de todo seguido de un personaje". Para obtener más caracteres del final, agregue sin embargo muchos puntos en la afirmación de búsqueda anticipada:

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

donde .{2} significa .. , o "cualquiera de los dos caracteres", por 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 tendrá que paste el valor de la variable en la cadena de expresión regular:

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


Prueba esto:

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

Se debe dar:

[1] "string"


Si no te importa usar el paquete stringr , 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"


Una alternativa a substr es dividir la cadena en una lista de caracteres individuales y procesar que:

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


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"


Una solución de base R simple que utiliza la función substring() (¿quién sabía que esta función existía incluso?):

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

Esto se aprovecha básicamente de estar debajo de substr() pero tiene un valor final predeterminado de 1,000,000.

Ejemplos:

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


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.


Utilice la función stringi paquete stringi . Para obtener subcadenas del final, usa números negativos. Vea 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

Está disponible en CRAN ahora, simplemente escriba

install.packages("stringi")

para instalar este paquete.


Yo uso substr también, pero de una manera diferente. Quiero extraer los últimos 6 caracteres de "Dame tu comida". Aquí están los pasos:

(1) Dividir los personajes.

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

(2) Extrae los últimos 6 caracteres.

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

Salida:

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

Se puede acceder a cada uno de los caracteres mediante splits[[1]][x] , donde x es 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.


ACTUALIZACIÓN : según lo señalado por mdsumner , el código original ya está vectorizado porque substr 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 caracteres.


No tengo conocimiento de 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 se vectoriza, 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"


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