Answers:
我不知道基R中的任何内容,但是直接使用substr
and 编写一个函数来执行此操作很简单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"
nchar(x)
通过将其分配给局部变量来避免两次调用会更有效吗?
如果您不介意使用该stringr
软件包,str_sub
则非常方便,因为您可以使用负数来倒数:
x <- "some text in a string"
str_sub(x,-6,-1)
[1] "string"
或者,正如Max在对此答案的评论中指出的那样,
str_sub(x, start= -6)
[1] "string"
stringr
已经stringi
作为后端进行了重新制作,因此现在应该与NAs等一起使用。
使用包中的stri_sub
函数stringi
。要从结尾获取子字符串,请使用负数。看下面的例子:
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)
因此,“摆脱所有跟着一个字符的现象”。要从结尾抓取更多字符,请在前瞻断言中添加许多点:
sub('.*(?=.{2}$)', '', string, perl=T)
其中.{2}
表示..
或“任何两个字符”,因此表示“删除所有后面两个字符的内容”。
sub('.*(?=.{3}$)', '', string, perl=T)
例如三个字符,等等。您可以设置要使用变量捕获的字符数,但是必须将paste
变量值放入正则表达式字符串中:
n = 3
sub(paste('.+(?=.{', n, '})', sep=''), '', string, perl=T)
regmatches(x, regexpr(".{6}$", x))
更新:如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
字符。
(nchar(x)-n)
到(nchar(x)-n+1)
”
一种替代方法substr
是将字符串分成单个字符列表,然后执行以下操作:
N <- 2
sapply(strsplit(x, ""), function(x, n) paste(tail(x, n), collapse = ""), N)
我使用以下代码来获取字符串的最后一个字符。
substr(output, nchar(stringOfInterest), nchar(stringOfInterest))
您可以使用nchar(stringOfInterest)来弄清楚如何获得最后几个字符。
对@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"