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

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

【问题讨论】:

    标签: r string substring


    【解决方案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"
                    

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2017-12-28
                      • 2021-05-29
                      • 1970-01-01
                      • 1970-01-01
                      • 2014-08-24
                      • 2013-03-31
                      相关资源
                      最近更新 更多