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

时间:2011-11-01 08:11:19

标签: r string substring

如何从R中的字符串中获取最后n个字符? 有没有类似SQL的功能?

15 个答案:

答案 0 :(得分:244)

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

答案 1 :(得分:162)

如果您不介意使用stringr软件包,str_sub非常方便,因为您可以使用底片向后计数:

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

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

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

答案 2 :(得分:41)

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

安装此软件包。

答案 3 :(得分:20)

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

> [1] "example"
> 

答案 4 :(得分:10)

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

答案 5 :(得分:8)

另一种合理直接的方法是使用正则表达式和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)

答案 6 :(得分:6)

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

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

答案 7 :(得分:6)

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

答案 8 :(得分:4)

I use substr too, but in a different way. I want to extract the last 6 characters of "Give me your food." Here are the steps:

(1) Split the characters

splits <- strsplit("Give me your food.", split = "")

(2) Extract the last 6 characters

tail(splits[[1]], n=6)

Output:

[1] " " "f" "o" "o" "d" "."

Each of the character can be accessed by splits[[1]][x], where x is 1 to 6.

答案 9 :(得分:3)

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

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

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

答案 10 :(得分:2)

尝试一下:

x <- "some text in a string"
n <- 5
substr(x, nchar(x)-n, nchar(x))

应该给:

[1] "string"

答案 11 :(得分:1)

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

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

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

答案 12 :(得分:1)

在上次有关R编程中的字符串操作的考试不及格之后,我编写了一些可以完成所有这些功能的函数。如果您来自Excel,则这些函数将类似于LEFT()RIGHT()MID()函数。


# This counts from the left and then extract n characters

str_left <- function(string, n) {
  substr(string, 1, n)
}



# This counts from the right and then extract n characters

str_right <- function(string, n) {
  substr(string, nchar(string) - (n - 1), nchar(string))
}


# This extract characters from the middle

str_mid <- function(string, from = 2, to = 5){
  
  substr(string, from, to)
  }

示例:

x <- "some text in a string"
str_left(x, 4)
[1] "some"

str_right(x, 6)
[1] "string"

str_mid(x, 6, 9)
[1] "text"

答案 13 :(得分: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"

答案 14 :(得分:0)

以防万一需要挑选一系列字符:

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