Как я могу получить последние n символов из строки в R? Есть ли такая функция, как SQL RIGHT?
Извлечение последних n символов из строки в R
Ответ 1
Я не знаю ничего в базе 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"
Ответ 2
Если вы не возражаете против использования пакета stringr
, str_sub
удобен, потому что вы можете использовать негативы для обратного отсчета:
x <- "some text in a string"
str_sub(x,-6,-1)
[1] "string"
Или, как указывает Макс в комментарии к этому ответу,
str_sub(x, start= -6)
[1] "string"
Ответ 3
Используйте 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")
чтобы установить этот пакет.
Ответ 4
str = 'This is an example'
n = 7
result = substr(str,(nchar(str)+1)-n,nchar(str))
print(result)
> [1] "example"
>
Ответ 5
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
.
Ответ 6
Другим достаточно простым способом является использование регулярных выражений и 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)
Ответ 7
Альтернативой substr
является разделение строки на список отдельных символов и процесс, который:
N <- 2
sapply(strsplit(x, ""), function(x, n) paste(tail(x, n), collapse = ""), N)
Ответ 8
Я тоже использую 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.
Ответ 9
кто-то раньше использует аналогичное решение для моего, но мне легче думать, как показано ниже:
> 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))
Это приведет к появлению последних символов по желанию.
Ответ 10
Я использовал следующий код, чтобы получить последний символ строки.
substr(output, nchar(stringOfInterest), nchar(stringOfInterest))
Вы можете играть с nchar (stringOfInterest), чтобы выяснить, как получить последние несколько символов.
Ответ 11
Небольшая модификация в решении @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"