2011-11-01 39 views

Respuesta

191

no estoy consciente de nada en la base de R, pero es recta hacia adelante para hacer una función para hacer esto utilizando 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 es vectorizado, como puntos @mdsumner fuera. Considere lo siguiente:

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

y cuidado con AN ... – hadley

+0

Uso paquete stringi. Funciona bien con NA y todas las codificaciones :) – bartektartanus

+0

¿Sería más eficaz evitar llamar 'nchar (x)' dos veces asignándola a una variable local? –

10

ACTUALIZACIÓN: como señaló mdsumner, el código original ya está vectorizada porque es substr. Debería haber sido más cuidadoso.

Y si quieres una versión vectorizada (basado en el código Andrie 's)

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.

+0

Creo que quieres decir "' (nchar (x) -n) 'a' (nchar (x) -n + 1) '" –

+0

Andrie's ya está vectorizado. – mdsumner

+3

sapply! = Vectorizado –

119

Si no les importa usar el paquete stringr, str_sub es útil porque se puede utilizar negativos a contar hacia atrás:

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

O, como señala Max en un comentario a esta respuesta,

str_sub(x, start= -6) 
[1] "string" 
+20

también, str_sub (x, start = -n) obtiene n últimos caracteres. – Max

+1

stringr no funciona bien con el valor de NA y toda la codificación. Recomiendo encarecidamente el paquete de stringi :) – bartektartanus

+2

Creo que 'stringr' se ha rehecho usando' stringi' como back-end, por lo que debería funcionar con NAs, etc. ahora. –

6

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

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

Detecto un sistema.Time() Battle brewing :-) –

18
str = 'This is an example' 
n = 7 
result = substr(str,(nchar(str)+1)-n,nchar(str)) 
print(result) 

> [1] "example" 
> 
+0

Esta es la mejor respuesta que no implica el uso de ningún paquete – prab4th

33

Use stri_sub function from stringi package. Para obtener subcadena desde el final, use números negativos. vistazo a continuación para 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.

7

Otra forma razonablemente sencilla es utilizar expresiones regulares y sub:

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

Así, "deshacerse de todo seguido de un carácter". Para hacerse con más caracteres fuera de la final, sin embargo añadir muchos puntos en la afirmación de búsqueda hacia delante:

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

donde .{2} significa .., o "dos caracteres", por lo que significa "deshacerse de todo seguido de dos caracteres".

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

de tres caracteres, etc Usted puede ajustar el número de caracteres para agarrar con una variable, sino que tendrá que paste el valor de la variable en la cadena de expresión regular:

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

Para evitar todos los look-aheads, etc., podría hacer 'regmatches (x, regexpr (". {6} $ ", x))' – thelatemail

4

I use substr también, pero de una manera diferente. Quiero extraer los últimos 6 caracteres de "Dame tu comida". Estos son los pasos:

(1) Dividir los personajes

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

(2) Extraer los últimos 6 caracteres

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

Salida:

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

Cada uno de los caracteres se puede acceder por splits[[1]][x], donde x es 1 a 6.

0

una pequeña modificación en la solución @Andrie da también 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 a la izquierda:

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

alguien antes utiliza 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 según se desee.

1

Utilicé el siguiente código para obtener el último carácter de una cadena.

substr(output, nchar(stringOfInterest), nchar(stringOfInterest)) 

Puede jugar con el nchar (stringOfInterest) para descubrir cómo obtener los últimos caracteres.

1

Una solución de base R simple usando la función substring() (que sabía que existiera esta función?):

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

Esto toma ventaja de ser básicamente 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!" 
Cuestiones relacionadas