Витяг останніх n символів з рядка в R


271

Як я можу отримати останні n символів із рядка в R? Чи існує така функція, як SQL RIGHT?

Відповіді:


282

Мені нічого не відомо в базі 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 та всім кодуванням. Я настійно рекомендую пакет струн :)
bartektartanus

3
Я вважаю, stringrщо його переробляють, використовуючи stringiяк бекенд, тому зараз слід працювати з НС тощо.
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)

Отже, "позбудьтесь всього, за яким рухається один персонаж". Щоб схопити більше символів до кінця, додайте скільки завгодно крапок у твердженні lookahead:

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], де 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.