Estrarre gli ultimi n caratteri da una stringa in R


271

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

Risposte:


283

Non sono a conoscenza di nulla nella base R, ma è semplice fare una funzione per farlo usando substre 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 è vettorializzato, come sottolinea @mdsumner. Tener conto di:

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

1
Usa il pacchetto stringi. Funziona bene con NA e tutte le codifiche :)
bartektartanus

Sarebbe più efficiente evitare di chiamare nchar(x)due volte assegnandolo a una variabile locale?
Dave Jarvis,

206

Se non ti dispiace usare il stringrpacchetto, 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 sottolinea Max in un commento a questa risposta,

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

32
inoltre, str_sub (x, start = -n) ottiene n ultimi caratteri.
Max

2
stringr non funziona bene con il valore di NA e tutta la codifica. Consiglio vivamente il pacchetto stringi :)
bartektartanus,

3
Credo che stringrsia stato rifatto usando stringicome backend, quindi ora dovrebbe funzionare con i NA ecc.
m-dz,

44

Usa la stri_subfunzione dal stringipacchetto. Per ottenere la sottostringa dalla fine, utilizzare i 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"

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

Ora è disponibile su CRAN, basta digitare

install.packages("stringi")

per installare questo pacchetto.


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

> [1] "example"
> 

12

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 alla fine, aggiungi comunque molti punti nell'asserzione lookahead:

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

dove .{2}significa .., o "due caratteri qualsiasi", che significa "sbarazzarsi di tutto seguito da due caratteri".

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

per tre caratteri, ecc. Puoi impostare il numero di caratteri da catturare con una variabile, ma dovrai inserire pasteil valore della variabile nella stringa dell'espressione regolare:

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

2
Per evitare tutte le prospettive ecc., Potresti semplicemente fare regmatches(x, regexpr(".{6}$", x))
thelatemail

10

AGGIORNAMENTO : come notato da mdsumner , il codice originale è già vettorializzato perché substr lo è. Avrei dovuto essere più attento.

E se vuoi una versione vettorializzata (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"

Si noti che ho cambiato (nchar(x)-n)per (nchar(x)-n+1)ottenere ncaratteri.


Penso che intendi " (nchar(x)-n)a (nchar(x)-n+1)"
Xu Wang,

8

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

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

Questo sfrutta fondamentalmente l'essere 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!"

6

Un'alternativa a substrè quella di dividere la stringa in un elenco di singoli caratteri ed elaborare che:

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

6
Sento una battaglia di battaglie system.time () :-)
Carl Witthoft,

4

Anch'io lo uso substr, ma in 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) Estrarre gli ultimi 6 caratteri

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

Produzione:

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

È possibile accedere a ciascuno dei personaggi splits[[1]][x], dove x è compreso tra 1 e 6.


3

qualcuno prima usa una soluzione simile alla mia, ma trovo più facile pensare come di seguito:

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


3

Prova questo:

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

Darebbe:

[1] "string"

1

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 personaggi.


0

Una piccola modifica sulla soluzione @Andrie offre 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"

0

Nel caso in cui sia necessario scegliere 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"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.