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

从R中的字符串中提取最后n个字符,r,string,substring,R,String,Substring,如何从R中的字符串中获取最后n个字符? 有像SQL这样的函数吗?我不知道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"

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

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

x更新:如所述,原始代码已经矢量化,因为substr是。应该更加小心

如果您想要矢量化版本(基于的代码)

substrRight substrRight(c(“12345”,“ABCDE”),2)
12345 ABCDE
“45”“DE”

请注意,我已将
(nchar(x)-n)
更改为
(nchar(x)-n+1)
,以获取
n
字符。

如果您不介意使用
stringr
包,
stru sub
非常方便,因为您可以使用负数进行倒数:

x <- "some text in a string"
str_sub(x,-6,-1)
[1] "string"
sub('.*(?=.{3}$)', '', string, perl=T)

substr
的另一种方法是将字符串拆分为单个字符的列表,并进行以下处理:

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

N从
stringi
软件包中使用
striu sub
功能。 要从末尾获取子字符串,请使用负数。 请参见下面的示例:

stri_sub("abcde",1,3)
[1] "abc"
stri_sub("abcde",1,1)
[1] "a"
stri_sub("abcde",-3,-1)
[1] "cde"
您可以从github安装此软件包:

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

install.packages("stringi")

安装此软件包。

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

sub('.*(?=.$)', '', string, perl=T)
所以,“去掉所有跟在一个字符后面的东西”。若要从结尾抓取更多字符,请在前瞻断言中添加任意多的点:

sub('.*(?=.{2}$)', '', string, perl=T)
其中
{2}
表示
,或“任意两个字符”,意思是“去掉后面跟两个字符的所有内容”

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

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

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

(1) 拆分字符

splits <- strsplit("Give me your food.", split = "")
tail(splits[[1]], n=6)
输出:

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

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

对@Andrie solution稍作修改也可以得到补充:

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"
substrR 0)substr(x,(nchar(x)-n+1,nchar(x))其他substr(x,1,(nchar(x)+n))
}

x以前有人使用了与我类似的解决方案,但我发现更容易思考如下:

> 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))
>text n substr(x=text,start=nchar(text)-n,stop=nchar(text))

这将根据需要提供最后一个字符。

我使用以下代码获取字符串的最后一个字符

    substr(output, nchar(stringOfInterest), nchar(stringOfInterest))

您可以使用nchar(stringOfInterest)来找出如何获取最后几个字符。

使用
substring()
函数的简单base R解决方案(谁知道这个函数存在呢?):

sub('.*(?=.{3}$)', '', string, perl=T)
这利用了下面基本上是
substr()
的优势,但默认的结束值为1000000

示例:

> RIGHT('Hello World!',2)
[1] "d!"
> RIGHT('Hello World!',8)
[1] "o World!"

以防需要拾取一系列字符:

# For example, to get the date part from the string

substrRightRange <- function(x, m, n){substr(x, nchar(x)-m+1, nchar(x)-m+n)}

value <- "REGNDATE:20170526RN" 
substrRightRange(value, 10, 8)

[1] "20170526"
#例如,从字符串中获取日期部分
substrRightRange尝试以下方法:

x <- "some text in a string"
n <- 5
substr(x, nchar(x)-n, nchar(x))
如果您来自Excel,这些函数将类似于
LEFT()
RIGHT()
MID()
函数


#从左侧开始计数,然后提取n个字符

str_left我想你的意思是“
(nchar(x)-n)
(nchar(x)-n+1)
”此外,stru sub(x,start=-n)得到最后n个字符。stringr不能很好地处理NA的值和所有编码。我强烈建议使用stringi软件包:)我相信
stringr
是使用
stringi
作为后端重新制作的,所以现在应该可以使用NAs等。我感觉到一个系统。时间()战斗正在酝酿:-)使用stringi软件包。它适用于NAs和所有编码:)通过将其分配给局部变量来避免调用两次
nchar(x)
会更有效吗?为了避免所有的look aheads等,您只需执行
regmatches(x,regexpr(“.{6}$”,x))
    substr(output, nchar(stringOfInterest), nchar(stringOfInterest))
RIGHT = function(x,n){
  substring(x,nchar(x)-n+1)
}
> RIGHT('Hello World!',2)
[1] "d!"
> RIGHT('Hello World!',8)
[1] "o World!"
# For example, to get the date part from the string

substrRightRange <- function(x, m, n){substr(x, nchar(x)-m+1, nchar(x)-m+n)}

value <- "REGNDATE:20170526RN" 
substrRightRange(value, 10, 8)

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