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


当前回答

substr的另一种替代方法是将字符串拆分为单个字符的列表并处理:

N <- 2
sapply(strsplit(x, ""), function(x, n) paste(tail(x, n), collapse = ""), N)

其他回答

一个简单的基于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!"

对于那些来自Microsoft Excel或谷歌Sheets的人来说,你应该见过LEFT(), RIGHT()和MID()这样的函数。我已经创建了一个名为forstringr的包,其开发版本目前在Github上。

if(!require("devtools")){
 install.packages("devtools")
}

devtools::install_github("gbganalyst/forstringr")

library(forstringr)

str_left():从左边开始计数,然后提取n个字符 str_right()-从右边开始计数,然后提取n个字符 str_mid()-从中间提取字符

例子:


x <- "some text in a string"

str_left(x, 4)

[1] "some"

str_right(x, 6)

[1] "string"

str_mid(x, 6, 4)

[1] "text"

另一种合理直接的方法是使用正则表达式和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)

更新:正如mdsumner所指出的,原始代码已经向量化了,因为substr是。我应该更小心的。

如果你想要一个矢量化的版本(基于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个字符。

我不知道base 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"