从R中的string中提取最后n个字符
如何从R中的string获取最后的n个字符? 有没有像SQL的权利function?
我没有意识到任何基于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"
@mdsumner指出,这是vector化的。 考虑:
x <- c("some text in a string", "I really need to learn how to count") substrRight(x, 6) [1] "string" " count"
如果您不介意使用stringr
软件包,则str_sub
非常方便,因为您可以使用负数来反向计数:
x <- "some text in a string" str_sub(x,-6,-1) [1] "string"
或者,正如马克斯在对这个答案的评论中指出的那样,
str_sub(x, start= -6) [1] "string"
使用stringi
包中的stri_sub
函数。 要从最后获得子string,请使用负数。 请看下面的例子:
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上可用,只需input
install.packages("stringi")
安装这个包。
str = 'This is an example' n = 7 result = substr(str,(nchar(str)+1)-n,nchar(str)) print(result) > [1] "example" >
更新 :如mdsumner所指出的,原始代码已经被vector化,因为substr是。 应该更加小心。
如果你想要一个vector化的版本(基于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
字符。
另一个相当直接的方法是使用正则expression式和sub
:
sub('.*(?=.$)', '', string, perl=T)
所以,“摆脱一个人物所有的一切”。 为了抓取更多的字符,在前视断言中join许多点:
sub('.*(?=.{2}$)', '', string, perl=T)
其中.{2}
意思是,或“任何两个字符”,所以意思是“摆脱一切后面跟着两个字符”。
sub('.*(?=.{3}$)', '', string, perl=T)
三个字符等。您可以设置字符的数量来抓取一个variables,但你必须paste
到正则expression式string的variables值:
n = 3 sub(paste('.+(?=.{', n, '})', sep=''), '', string, perl=T)
substr
的替代方法是将string拆分为单个字符的列表并处理:
N <- 2 sapply(strsplit(x, ""), function(x, n) paste(tail(x, n), collapse = ""), N)
我也使用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。
以前有人使用类似的解决scheme,但我觉得更容易思考如下:
> 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))
这将根据需要带来最后的字符。
我使用下面的代码来获取string的最后一个字符。
substr(output, nchar(stringOfInterest), nchar(stringOfInterest))
你可以玩nchar(stringOfInterest)来弄清楚如何得到最后几个字符。
@Andrie解决scheme的一些修改也给了补充:
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"