Извлечение последних n символов из строки в R


271

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

Ответы:


283

Я ничего не знаю в базе 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"

1
Используйте пакет stringi. Работает нормально с NA и всеми кодировками :)
bartektartanus

Было бы более эффективно избежать nchar(x)двойного вызова , назначая его локальной переменной?
Дейв Джарвис

206

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

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

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

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

32
также str_sub (x, start = -n) получает n последних символов.
Макс

2
stringr плохо работает со значением NA и всей кодировкой. Я настоятельно рекомендую пакет
stringi

3
Я считаю, stringrчто был переделан с использованием stringiв качестве бэкэнда, так что теперь следует работать с NA и т.д.
m-dz

44

Используйте 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
str = 'This is an example'
n = 7
result = substr(str,(nchar(str)+1)-n,nchar(str))
print(result)

> [1] "example"
> 

12

Другой достаточно простой способ - использовать регулярные выражения и 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)

2
Чтобы избежать всех упущений и т. Д., Вы можете просто сделатьregmatches(x, regexpr(".{6}$", x))
thelatemail

10

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

И если вы хотите векторизованную версию (на основе кода Андри )

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символы.


Я думаю, что вы имеете в виду « (nchar(x)-n)до (nchar(x)-n+1)»
Сюй Ван

8

Простое базовое решение 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

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

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

6
Я чувствую, как готовится битва
system.time

4

Я 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], где х от 1 до 6.


3

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

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

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


3

Попробуй это:

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

Это должно дать:

[1] "string"

1

Я использовал следующий код, чтобы получить последний символ строки.

    substr(output, nchar(stringOfInterest), nchar(stringOfInterest))

Вы можете поиграть с nchar (stringOfInterest), чтобы выяснить, как получить последние несколько символов.


0

Небольшая модификация решения @Andrie дает также дополнение:

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"

Это было то, что я искал. И это приглашает на левую сторону:

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

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

# 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"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.