从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 中的任何内容,但使用 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 指出的那样,这是矢量化的。考虑:
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 位或更多位连续匹配?