Risposte:
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"
nchar(x)due volte assegnandolo a una variabile locale?
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"
stringrsia stato rifatto usando stringicome backend, quindi ora dovrebbe funzionare con i NA ecc.
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.
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)
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 ncaratteri.
(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"