从R中的字符串中提取最后n个字符
如何从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"
有像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"