2011-11-01 553 views

回答

191

我不知道在基础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" 
+3

并观看了来港... – hadley

+0

使用stringi包。它适用于NAs和所有编码:) – bartektartanus

+0

避免通过将'nchar(x)'分配给局部变量两次更有效吗? –

10

UPDATE:如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字符。

+0

我认为你的意思是“(nchar(x)-n)'到'(nchar(x)-n + 1)'” –

+0

Andrie's已经被矢量化了。 – mdsumner

+3

sapply!=矢量化 –

119

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

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

或者像Max在这个答案评论指出,

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

另外,str_sub(x,start = -n)获取n个最后的字符。 – Max

+1

stringr不适用于NA的值和所有编码。我强烈推荐stringi包:) – bartektartanus

+2

我相信'stringr'已经使用'stringi'作为后端重制,所以现在应该与NAs等一起工作。 –

6

substr的替代方法是将字符串分割成单个字符和处理的列表:

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

我感觉系统。时间()战斗酿造:-) –

18
str = 'This is an example' 
n = 7 
result = substr(str,(nchar(str)+1)-n,nchar(str)) 
print(result) 

> [1] "example" 
> 
+0

这是最好的答案,不涉及任何软件包的使用 – prab4th

33

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

安装该软件包。

7

另一种相当简单的方法是使用正则表达式和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) 
+1

为了避免所有的预见等,你可以做'regmatches(x,regexpr(“。{6} $ “,x))' – thelatemail

4

我也使用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.

0

上@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" 
2

有人之前使用了类似的解决方案,我的,但我觉得它更容易如下思考:

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

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

1

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

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

你可以玩nchar(stringOfInterest)来弄清楚如何得到最后几个字符。

1

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