从R中的字符串中提取最后n个字符

Bra*_*ani 249 string substring r

如何从R中的字符串中获取最后n个字符?有没有像SQL一样的功能?

And*_*rie 261

我不知道基础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"
Run Code Online (Sandbox Code Playgroud)

正如@mdsumner指出的那样,这是矢量化的.考虑:

x <- c("some text in a string", "I really need to learn how to count")
substrRight(x, 6)
[1] "string" " count"
Run Code Online (Sandbox Code Playgroud)

  • 通过将 `nchar(x)` 分配给局部变量来避免两次调用它会更有效吗? (3认同)

Xu *_*ang 187

如果您不介意使用该stringr包,str_sub则很方便,因为您可以使用底片向后计数:

x <- "some text in a string"
str_sub(x,-6,-1)
[1] "string"
Run Code Online (Sandbox Code Playgroud)

或者,正如Max在对此答案的评论中指出的那样,

str_sub(x, start= -6)
[1] "string"
Run Code Online (Sandbox Code Playgroud)

  • 另外,str_sub(x,start = -n)获取n个最后一个字符. (28认同)
  • 我相信`stringr`已经使用`stringi`作为后端进行了重制,所以现在应该使用NAs等. (3认同)
  • stringr不适用于NA的值和所有编码。我强烈推荐stringi包:) (2认同)

bar*_*nus 43

使用包中的stri_sub功能stringi.要从末尾获取子字符串,请使用负数.请看下面的示例:

stri_sub("abcde",1,3)
[1] "abc"
stri_sub("abcde",1,1)
[1] "a"
stri_sub("abcde",-3,-1)
[1] "cde"
Run Code Online (Sandbox Code Playgroud)

您可以从github安装此软件包:https://github.com/Rexamine/stringi

它现在可以在CRAN上使用,只需键入即可

install.packages("stringi")
Run Code Online (Sandbox Code Playgroud)

安装此包.


And*_*rew 20

str = 'This is an example'
n = 7
result = substr(str,(nchar(str)+1)-n,nchar(str))
print(result)

> [1] "example"
> 
Run Code Online (Sandbox Code Playgroud)


小智 12

尝试这个:

x <- "some text in a string"
n <- 5
substr(x, nchar(x)-n, nchar(x))
Run Code Online (Sandbox Code Playgroud)

它应该给出:

[1] "string"
Run Code Online (Sandbox Code Playgroud)


Lau*_*ent 10

更新:如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"
Run Code Online (Sandbox Code Playgroud)

请注意,我已经改变(nchar(x)-n),以(nchar(x)-n+1)获得n字符.

  • sapply!=矢量化 (3认同)

dsb*_*dsb 9

另一种相当简单的方法是使用正则表达式和sub:

sub('.*(?=.$)', '', string, perl=T)
Run Code Online (Sandbox Code Playgroud)

所以,"摆脱一切后跟一个角色".要在最后抓取更多字符,请在前瞻断言中添加多个点:

sub('.*(?=.{2}$)', '', string, perl=T)
Run Code Online (Sandbox Code Playgroud)

其中的.{2}意思..,或"任意两个字符",意思是"摆脱一切后跟两个字符".

sub('.*(?=.{3}$)', '', string, perl=T)
Run Code Online (Sandbox Code Playgroud)

对于三个字符等,您可以设置要使用变量抓取的字符数,但是您必须将paste变量值放入正则表达式字符串中:

n = 3
sub(paste('.+(?=.{', n, '})', sep=''), '', string, perl=T)
Run Code Online (Sandbox Code Playgroud)

  • 为了避免所有的前瞻等,你可以做`regmatches(x,regexpr(".{6} $",x))` (2认同)

And*_*nes 7

一个简单的基本R解决方案使用该substring()功能(谁知道这个功能甚至存在?):

RIGHT = function(x,n){
  substring(x,nchar(x)-n+1)
}
Run Code Online (Sandbox Code Playgroud)

这利用了基本上在substr()下面,但默认结束值为1,000,000.

例子:

> RIGHT('Hello World!',2)
[1] "d!"
> RIGHT('Hello World!',8)
[1] "o World!"
Run Code Online (Sandbox Code Playgroud)


mds*_*ner 6

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

N <- 2
sapply(strsplit(x, ""), function(x, n) paste(tail(x, n), collapse = ""), N)
Run Code Online (Sandbox Code Playgroud)

  • 我感觉system.time()战斗酿造:-) (6认同)