Risposte:
Non sono a conoscenza di nulla 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 è 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"
nchar(x)
due volte assegnandolo a una variabile locale?
Se non ti dispiace usare il stringr
pacchetto, 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"
stringr
sia stato rifatto usando stringi
come backend, quindi ora dovrebbe funzionare con i NA ecc.
Usa la stri_sub
funzione dal stringi
pacchetto. 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.
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 paste
il valore della variabile nella stringa dell'espressione regolare:
n = 3
sub(paste('.+(?=.{', n, '})', sep=''), '', string, perl=T)
regmatches(x, regexpr(".{6}$", x))
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 n
caratteri.
(nchar(x)-n)
a (nchar(x)-n+1)
"
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!"
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)
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.
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.
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.
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"