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

Posted

技术标签:

【中文标题】从R中的字符串中提取最后n个字符【英文标题】:Extracting the last n characters from a string in R 【发布时间】:2011-12-19 07:38:08 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

使用 stringi 包。它适用于 NA 和所有编码:) 通过将nchar(x)分配给一个局部变量来避免调用两次会更有效吗?【参考方案2】:

如果您不介意使用 stringr 包,str_sub 很方便,因为您可以使用负数倒数:

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

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

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

【讨论】:

另外,str_sub(x,start=-n) 获取最后 n 个字符。 stringr 不适用于 NA 的值和所有编码。我强烈推荐 stringi 包:) 我相信stringr 已经使用stringi 作为后端进行了重制,所以现在应该可以使用 NA 等。【参考方案3】:

使用 stringi 包中的 stri_sub 函数。 要从末尾获取子字符串,请使用负数。 看看下面的例子:

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

安装这个包。

【讨论】:

【参考方案4】:
str = 'This is an example'
n = 7
result = substr(str,(nchar(str)+1)-n,nchar(str))
print(result)

> [1] "example"
> 

【讨论】:

【参考方案5】:

另一种相当直接的方法是使用正则表达式和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))【参考方案6】:

更新:正如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) to (nchar(x)-n+1)【参考方案7】:

使用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】:

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

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

【讨论】:

我感觉到 system.time() 战斗正在酝酿 :-)【参考方案9】:

试试这个:

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

它应该给:

[1] "string"

【讨论】:

但这会返回最后 6 个字符而不是 5【参考方案10】:

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

【讨论】:

【参考方案11】:

以前有人使用过与我类似的解决方案,但我发现如下更容易思考:

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

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

【讨论】:

【参考方案12】:

如果您来自 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】:

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

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

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

【讨论】:

【参考方案14】:

对@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"

【讨论】:

【参考方案15】:

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

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

【讨论】:

以上是关于从R中的字符串中提取最后n个字符的主要内容,如果未能解决你的问题,请参考以下文章

Perl:如何将字符串的最后 n 位与 n 位或更多位连续匹配?

oc如何提取文件中的第n行第n个字符 比如: hello, boy, girl, i love

JAVA如何提取字符串中的第1个字符

如何从字符串中仅提取版本号

从R中的字符串中提取对象数组[重复]

R语言中如何提取字符串