Ответы:
Я ничего не знаю в базе 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
в качестве бэкэнда, так что теперь следует работать с NA и т.д.
Используйте 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)
Итак, «избавьтесь от всего, за чем следует один персонаж». Чтобы получить больше символов в конце, добавьте, однако, много точек в проверочное утверждение:
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]
, где х от 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"