Извлечение последних n символов из строки в R - PullRequest
234 голосов
/ 01 ноября 2011

Как я могу получить последние n символов из строки в R?Есть ли такая функция, как RIGHT в SQL?

Ответы [ 14 ]

246 голосов
/ 01 ноября 2011

Я ничего не знаю в базе R, но довольно просто сделать функцию для этого, используя substr и 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"

Это векторизация, как указывает @mdsumner.Рассмотрим:

x <- c("some text in a string", "I really need to learn how to count")
substrRight(x, 6)
[1] "string" " count"
166 голосов
/ 01 ноября 2011

Если вы не возражаете против использования пакета stringr, str_sub удобен, потому что вы можете использовать негативы для обратного отсчета:

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

Или, как Макс указывает в комментарии к этомуответ,

str_sub(x, start= -6)
[1] "string"
41 голосов
/ 16 июля 2013

Используйте функцию stri_sub из пакета stringi.Чтобы получить подстроку с конца, используйте отрицательные числа.Ниже приведены примеры:

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

Вы можете установить этот пакет с github: https://github.com/Rexamine/stringi

Теперь он доступен на CRAN, просто наберите

install.packages("stringi")

установить этот пакет.

20 голосов
/ 01 ноября 2011
str = 'This is an example'
n = 7
result = substr(str,(nchar(str)+1)-n,nchar(str))
print(result)

> [1] "example"
> 
10 голосов
/ 01 ноября 2011

ОБНОВЛЕНИЕ : как отмечено mdsumner , исходный код уже векторизован, поскольку substr равен. Должен был быть более осторожным.

А если вам нужна векторизованная версия (на основе кода 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"

Обратите внимание, что я изменил (nchar(x)-n) на (nchar(x)-n+1), чтобы получить n символов.

9 голосов
/ 11 сентября 2013

Другой достаточно простой способ - использовать регулярные выражения и sub:

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

Итак, «избавьтесь от всего, за чем следует один символ». Чтобы получить больше символов в конце, добавьте, однако, много точек в проверочное утверждение:

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

, где .{2} означает .. или «любые два символа», что означает «избавиться от всего, за которым следуют два символа».

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

для трех символов и т. Д. Вы можете установить количество символов для захвата с переменной, но вам придется paste значение переменной в строке регулярного выражения:

n = 3
sub(paste('.+(?=.{', n, '})', sep=''), '', string, perl=T)
6 голосов
/ 04 января 2018

Простое решение Base R с использованием функции substring() (кто знал, что эта функция вообще существует?):

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

Для этого используется, в основном, substr() внизу, но конечное значение по умолчанию равно 1 000 000.

Примеры:

> RIGHT('Hello World!',2)
[1] "d!"
> RIGHT('Hello World!',8)
[1] "o World!"
6 голосов
/ 01 ноября 2011

Альтернативой substr является разбиение строки на список из отдельных символов и обработка, которая:

N <- 2
sapply(strsplit(x, ""), function(x, n) paste(tail(x, n), collapse = ""), N)
4 голосов
/ 25 июня 2015

Я тоже использую substr, но по-другому. Я хочу извлечь последние 6 символов «Дай мне свою еду». Вот шаги:

(1) Разделить символы

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

(2) Извлечь последние 6 символов

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

Выход:

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

Доступ к каждому персонажу можно получить с помощью splits[[1]][x], где x - от 1 до 6.

3 голосов
/ 05 марта 2017

кто-то раньше использовал подобное решение для моего, но мне легче думать, как показано ниже:

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

Это принесет последние символы по желанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...