Відповіді:
Мені нічого не відомо в базі 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"
nchar(x)
двічі, призначивши його локальній змінній?
Якщо ви не проти використовувати stringr
пакет, str_sub
це зручно, тому що ви можете використовувати негативи для підрахунку відсталих:
x <- "some text in a string"
str_sub(x,-6,-1)
[1] "string"
Або, як Макс вказує в коментарі до цієї відповіді,
str_sub(x, start= -6)
[1] "string"
stringr
що його переробляють, використовуючи stringi
як бекенд, тому зараз слід працювати з НС тощо.
Використовуйте 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")
встановити цей пакет.
Ще один досить простий спосіб - використовувати регулярні вирази та 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)
regmatches(x, regexpr(".{6}$", x))
ОНОВЛЕННЯ : як зазначає 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)
»
Просте базове рішення 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!"
Альтернативою substr
є розділити рядок на список одиночних символів і обробити:
N <- 2
sapply(strsplit(x, ""), function(x, n) paste(tail(x, n), collapse = ""), N)
Я 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.
хтось раніше використовував подібне рішення для мого, але мені легше подумати як нижче:
> 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))
Це приведе останні бажані символи за бажанням.
Я використовував наступний код, щоб отримати останній символ рядка.
substr(output, nchar(stringOfInterest), nchar(stringOfInterest))
Ви можете пограти з nchar (stringOfInterest), щоб зрозуміти, як отримати останні кілька символів.
Невелика модифікація рішення @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"