【发布时间】:2011-12-19 07:38:08
【问题描述】:
如何从 R 中的字符串中获取最后 n 个字符? 有没有类似 SQL 的 RIGHT 的函数?
【问题讨论】:
如何从 R 中的字符串中获取最后 n 个字符? 有没有类似 SQL 的 RIGHT 的函数?
【问题讨论】:
我不知道基础 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"
【讨论】:
nchar(x)分配给一个局部变量来避免调用两次会更有效吗?
如果您不介意使用 stringr 包,str_sub 很方便,因为您可以使用负数倒数:
x <- "some text in a string"
str_sub(x,-6,-1)
[1] "string"
或者,正如 Max 在对此答案的评论中指出的那样,
str_sub(x, start= -6)
[1] "string"
【讨论】:
stringr 已经使用stringi 作为后端进行了重制,所以现在应该可以使用 NA 等。
使用 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")
安装这个包。
【讨论】:
str = 'This is an example'
n = 7
result = substr(str,(nchar(str)+1)-n,nchar(str))
print(result)
> [1] "example"
>
【讨论】:
另一种相当直接的方法是使用正则表达式和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))
【讨论】:
(nchar(x)-n) to (nchar(x)-n+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!"
【讨论】:
substr 的替代方法是将字符串拆分为单个字符列表并处理:
N <- 2
sapply(strsplit(x, ""), function(x, n) paste(tail(x, n), collapse = ""), N)
【讨论】:
试试这个:
x <- "some text in a string"
n <- 5
substr(x, nchar(x)-n, nchar(x))
它应该给:
[1] "string"
【讨论】:
我也使用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。
【讨论】:
以前有人使用过与我类似的解决方案,但我发现如下更容易思考:
> 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))
这将根据需要显示最后一个字符。
【讨论】:
如果您来自 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"
【讨论】:
我使用以下代码获取字符串的最后一个字符。
substr(output, nchar(stringOfInterest), nchar(stringOfInterest))
您可以使用 nchar(stringOfInterest) 来弄清楚如何获取最后几个字符。
【讨论】:
对@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"
【讨论】:
以防万一需要选择一系列字符:
# 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"
【讨论】: