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

179

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

Теги:
string
substring

11 ответов

181
Лучший ответ

Я не знаю ничего в базе 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"
  • 5
    И остерегайтесь NA ...
  • 1
    Используйте пакет stringi. Работает нормально с АН и всем кодированием :)
Показать ещё 1 комментарий
106

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

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

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

str_sub(x, start= -6)
[1] "string"
  • 24
    также str_sub (x, start = -n) получает n последних символов.
  • 1
    stringr плохо работает со значением NA и всей кодировкой. Я настоятельно рекомендую стринги пакет :)
Показать ещё 1 комментарий
28

Используйте 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")

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

17
str = 'This is an example'
n = 7
result = substr(str,(nchar(str)+1)-n,nchar(str))
print(result)

> [1] "example"
> 
10

UPDATE: как отмечено mdsumner, исходный код уже векторизован, потому что substr is. Должно быть более осторожным.

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

  • 0
    Я думаю, что вы имеете в виду " (nchar(x)-n) to (nchar(x)-n+1) "
  • 0
    Andrie's уже векторизован.
Показать ещё 1 комментарий
7

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

2

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

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

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

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"

Ещё вопросы

Сообщество Overcoder
Наверх
Меню