Estrarre gli ultimi n caratteri da una stringa in R

Come posso ottenere gli ultimi n caratteri da una stringa in R? Esiste una funzione come SQL’s RIGHT?

Non sono a conoscenza di alcunché nella base R, ma è semplice fare una funzione per farlo usando substr e 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" 

Questo è vettorizzato, come sottolinea @mdsumner. Prendere in considerazione:

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

Se non ti dispiace usare il pacchetto stringr , str_sub è utile perché puoi usare i negativi per contare all’indietro:

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

Oppure, come Max sottolinea in un commento a questa risposta,

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

Usa la funzione stringi dal pacchetto stringi . Per ottenere la sottostringa dalla fine, utilizzare numeri negativi. Guarda sotto per gli esempi:

 stri_sub("abcde",1,3) [1] "abc" stri_sub("abcde",1,1) [1] "a" stri_sub("abcde",-3,-1) [1] "cde" 

È ansible installare questo pacchetto da github: https://github.com/Rexamine/stringi

È disponibile su CRAN ora, è sufficiente digitare

 install.packages("stringi") 

per installare questo pacchetto.

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

AGGIORNAMENTO : come notato da mdsumner , il codice originale è già vettorizzato perché substr è. Dovrebbe essere stato più attento.

E se vuoi una versione vettoriale (basata sul codice di 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" 

Nota che ho cambiato (nchar(x)-n) in (nchar(x)-n+1) per ottenere n caratteri.

Un altro modo ragionevolmente semplice è usare espressioni regolari e sub :

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

Quindi, “sbarazzarsi di tutto seguito da un personaggio”. Per afferrare più personaggi dalla fine, aggiungi comunque molti punti nell’asserzione lookahead:

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

dove .{2} significa .. , o “qualsiasi due caratteri”, quindi significa “sbarazzarsi di tutto seguito da due caratteri”.

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

per tre caratteri, ecc. Puoi impostare il numero di caratteri da afferrare con una variabile, ma dovrai paste il valore della variabile nella stringa di espressione regolare:

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

Un’alternativa al substr è dividere la stringa in un elenco di singoli caratteri e elaborare ciò:

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

Io uso anche il substr , ma in un modo diverso. Voglio estrarre gli ultimi 6 caratteri di “Dammi il tuo cibo”. Ecco i passaggi:

(1) Dividi i personaggi

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

(2) Estrai gli ultimi 6 caratteri

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

Produzione:

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

È ansible accedere a ciascun carattere splits[[1]][x] , dove x è compreso tra 1 e 6.

Una semplice soluzione di base R che utilizza la funzione substring() (chi sapeva che questa funzione esisteva addirittura?):

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

Questo sfrutta fondamentalmente essendo substr() sotto, ma ha un valore finale predefinito di 1.000.000.

Esempi:

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

qualcuno prima usa una soluzione simile alla mia, ma trovo più semplice pensare come segue:

 > 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)) 

Questo porterà gli ultimi caratteri come desiderato.

Ho usato il seguente codice per ottenere l’ultimo carattere di una stringa.

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

Puoi giocare con nchar (stringOfInterest) per capire come ottenere gli ultimi pochi personaggi.

Prova questo:

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

Deve dare:

 [1] "string" 

Una piccola modifica sulla soluzione di @Andrie fornisce anche il 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" 

Era quello che stavo cercando. E invita a sinistra:

 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" 

Nel caso in cui sia necessario selezionare un intervallo di caratteri:

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