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

我怎么能从R中的字符串中得到最后n个字符? 有没有像SQL的RIGHT这样的函数?< / p >

468717 次浏览

我不知道底数R中的任何东西,但使用substrnchar创建一个函数来做到这一点很简单:

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"

更新:正如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字符。

如果你不介意使用stringr包,str_sub很方便,因为你可以使用负号来向后计数:

x <- "some text in a string"
str_sub(x,-6,-1)
[1] "string"

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

str_sub(x, start= -6)
[1] "string"

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

N <- 2
sapply(strsplit(x, ""), function(x, n) paste(tail(x, n), collapse = ""), N)
str = 'This is an example'
n = 7
result = substr(str,(nchar(str)+1)-n,nchar(str))
print(result)


> [1] "example"
>

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

安装此包。

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

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

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

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

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

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

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

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

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

(1)拆分字符

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。

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

之前有人使用了类似的解决方案,但我发现下面的想法更容易:

> 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))

这将产生所需的最后一个字符。

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

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

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

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

以防万一,如果需要选择一系列字符:

# 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"

对于那些来自Microsoft Excel或谷歌Sheets的人,你会看到像LEFT()RIGHT()MID()这样的函数。我已经创建了一个名为forstringr的包,它的开发版本目前在Github上。

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


devtools::install_github("gbganalyst/forstringr")


library(forstringr)
  • the str_left():从左边开始计数,然后提取n个字符

  • the str_right()-从右边开始计数,然后提取n个字符

  • the 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"