Respostas:
Não estou ciente de nada na base R, mas é simples criar uma função para fazer isso 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"
Isso é vetorizado, como aponta @mdsumner. Considerar:
x <- c("some text in a string", "I really need to learn how to count")
substrRight(x, 6)
[1] "string" " count"
nchar(x)
duas vezes atribuindo-o a uma variável local?
Se você não se importa em usar o stringr
pacote, str_sub
é útil porque você pode usar negativos para contar de trás para frente:
x <- "some text in a string"
str_sub(x,-6,-1)
[1] "string"
Ou, como Max aponta em um comentário para esta resposta,
str_sub(x, start= -6)
[1] "string"
stringr
tinha sido refeito usando stringi
como back-end, então deveria trabalhar com NAs etc. agora.
Use a stri_sub
função do stringi
pacote. Para obter a substring no final, use números negativos. Veja abaixo os exemplos:
stri_sub("abcde",1,3)
[1] "abc"
stri_sub("abcde",1,1)
[1] "a"
stri_sub("abcde",-3,-1)
[1] "cde"
Você pode instalar este pacote no github: https://github.com/Rexamine/stringi
Já está disponível no CRAN, basta digitar
install.packages("stringi")
para instalar este pacote.
Outra maneira razoavelmente direta é usar expressões regulares e sub
:
sub('.*(?=.$)', '', string, perl=T)
Então, "livre-se de tudo seguido por um personagem". Para pegar mais caracteres no final, adicione muitos pontos na asserção lookahead:
sub('.*(?=.{2}$)', '', string, perl=T)
onde .{2}
significa ..
, ou "quaisquer dois caracteres", o que significa "livrar-se de tudo seguido por dois caracteres".
sub('.*(?=.{3}$)', '', string, perl=T)
para três caracteres, etc. Você pode definir o número de caracteres a serem capturados com uma variável, mas precisará paste
do valor da variável na cadeia de expressão regular:
n = 3
sub(paste('.+(?=.{', n, '})', sep=''), '', string, perl=T)
regmatches(x, regexpr(".{6}$", x))
UPDATE : como observado pelo mdsumner , o código original já está vetorizado porque substr é. Deveria ter sido mais cuidadoso.
E se você quiser uma versão vetorizada (com base no código de 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"
Note que eu mudei (nchar(x)-n)
para (nchar(x)-n+1)
obter n
caracteres.
(nchar(x)-n)
a (nchar(x)-n+1)
"
Uma solução R simples de base usando a substring()
função (quem sabia que essa função existia?):
RIGHT = function(x,n){
substring(x,nchar(x)-n+1)
}
Isso tira vantagem de estar basicamente substr()
embaixo, mas tem um valor final padrão de 1.000.000.
Exemplos:
> RIGHT('Hello World!',2)
[1] "d!"
> RIGHT('Hello World!',8)
[1] "o World!"
Uma alternativa substr
é dividir a sequência em uma lista de caracteres únicos e processar que:
N <- 2
sapply(strsplit(x, ""), function(x, n) paste(tail(x, n), collapse = ""), N)
Eu substr
também uso , mas de uma maneira diferente. Quero extrair os últimos 6 caracteres de "Me dê sua comida". Aqui estão os passos:
(1) Divida os caracteres
splits <- strsplit("Give me your food.", split = "")
(2) Extraia os últimos 6 caracteres
tail(splits[[1]], n=6)
Resultado:
[1] " " "f" "o" "o" "d" "."
Cada um dos caracteres pode ser acessado por splits[[1]][x]
, onde x é 1 a 6.
alguém antes usa uma solução semelhante à minha, mas acho mais fácil pensar no seguinte:
> 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))
Isso trará os últimos caracteres conforme desejado.
Eu usei o código a seguir para obter o último caractere de uma string.
substr(output, nchar(stringOfInterest), nchar(stringOfInterest))
Você pode jogar com o nchar (stringOfInterest) para descobrir como obter os últimos caracteres.
Uma pequena modificação na solução @Andrie também oferece o 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 isso que eu estava procurando. E convida para o lado esquerdo:
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"