如何在R中获取字符串的最后n个字符?是否有像SQL的RIGHT函数一样的函数?
我不知道基本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"
如果你不介意使用 stringr
包,str_sub
很方便,因为你可以使用负数来倒数计数:
x <- "some text in a string"
str_sub(x,-6,-1)
[1] "string"
正如Max在对本答案的评论中指出的那样,
str_sub(x, start= -6)
[1] "string"
stringr
已经使用stringi
作为后端进行了重构,因此现在应该可以处理NA等内容。 - m-dz使用stringi
包中的stri_sub
函数。
要从结尾获取子字符串,请使用负数。
请参阅以下示例:
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")
安装此软件包。
str = 'This is an example'
n = 7
result = substr(str,(nchar(str)+1)-n,nchar(str))
print(result)
> [1] "example"
>
另一个相对简单的方法是使用正则表达式和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))
来实现。该代码可提取字符串 x 中的末尾 6 个字符。 - thelatemail试试这个:
x <- "some text in a string"
n <- 5
substr(x, nchar(x)-n, nchar(x))
它应该给出:
[1] "string"
(nchar(x)-n)
" 改为 "(nchar(x)-n+1)
"。 - Xu Wang使用substring()
函数的基本R解决方案(谁知道这个函数居然存在?):
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
,但是我使用不同的方法。我想提取“Give me your food.”的最后6个字符。以下是步骤: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。
nchar(x)
分配给一个本地变量,避免两次调用,这样会更有效率吗? - Dave Jarvis