如何从R中的字符串中获得最后n个字符? 有没有像SQL的RIGHT这样的函数?


当前回答

另一种合理直接的方法是使用正则表达式和sub:

sub('.*(?=.$)', '', string, perl=T)

所以,“去掉后跟一个字符的所有东西”。为了获取更多字符,在lookahead断言中添加任意数量的圆点:

sub('.*(?=.{2}$)', '', string, perl=T)

其中。{2}表示..或“任意两个字”,意思是“去掉后跟两个字的东西”。

sub('.*(?=.{3}$)', '', string, perl=T)

对于三个字符,等等。你可以用一个变量设置要抓取的字符数,但你必须将变量值粘贴到正则表达式字符串中:

n = 3
sub(paste('.+(?=.{', n, '})', sep=''), '', string, perl=T)

其他回答

对@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"

试试这个:

x <- "some text in a string"
n <- 5
substr(x, nchar(x)-n, nchar(x))

它应该给出:

[1] "string"

我也使用substr,但方式不同。我想提取“给我你的食物”的最后6个字符。以下是步骤:

(1)拆分字符

splits <- strsplit("Give me your food.", split = "")

(2)提取最后6个字符

tail(splits[[1]], n=6)

输出:

[1] " " "f" "o" "o" "d" "."

每个字符都可以通过分割[[1]][x]访问,其中x是1到6。

另一种合理直接的方法是使用正则表达式和sub:

sub('.*(?=.$)', '', string, perl=T)

所以,“去掉后跟一个字符的所有东西”。为了获取更多字符,在lookahead断言中添加任意数量的圆点:

sub('.*(?=.{2}$)', '', string, perl=T)

其中。{2}表示..或“任意两个字”,意思是“去掉后跟两个字的东西”。

sub('.*(?=.{3}$)', '', string, perl=T)

对于三个字符,等等。你可以用一个变量设置要抓取的字符数,但你必须将变量值粘贴到正则表达式字符串中:

n = 3
sub(paste('.+(?=.{', n, '})', sep=''), '', string, perl=T)

使用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")

安装此包。