代码之家  ›  专栏  ›  技术社区  ›  Lotw

如何删除最后第三个“uu”[重复]

  •  0
  • Lotw  · 技术社区  · 6 年前

    这个问题已经有了答案:

    我有一个带有字符串的列,如下面的示例:

    string_cell<-"32_5_56_78_a267_b679_bh76_26442"
    

    string_cell<-"5739_67503_8492_hgjmk"
    

    我只想把所有的东西都放在最后三个“_uuu”之后,这样我就能得到:

    b679_bh76_26442
    67503_8492_hgjmk
    

    我看过删除最后一个字符后所有内容的主题,如 This Example 但似乎找不到我问题的答案。

    非常感谢!

    3 回复  |  直到 6 年前
        1
  •  2
  •   denis    6 年前
    string_cell <- c("32_5_56_78_a267_b679_bh76_26442", "5739_67503_8492_hgjmk")
    gsub("^.*_([A-z0-9]+_[A-z0-9]+_[A-z0-9]+$)","\\1",string_cell)
    
    [1] "b679_bh76_26442"  "67503_8492_hgjmk"
    
        2
  •  2
  •   AkselA    6 年前
    string_cell <- c("32_5_56_78_a267_b679_bh76_26442", "5739_67503_8492_hgjmk")
    
    s <- strsplit(string_cell, "_")
    
    sapply(s, function(x) paste(tail(x, 3), collapse="_"))
    # [1] "b679_bh76_26442"  "67503_8492_hgjmk"
    
        3
  •  0
  •   jay.sf    6 年前

    这个怎么样?它分割字符,定位最后的第三个字符 "_" 并将剩余部分粘贴在一起。

    myKeep <- function(string_cell){
      s <- strsplit(string_cell, "")[[1]]
      paste0(s[(rev(grep("_", s))[3]:nchar(string_cell))[-1]], collapse="")
    }
    

    结果:

    string_cell <- c("32_5_56_78_a267_b679_bh76_26442", "5739_67503_8492_hgjmk")
    
    > sapply(string_cell, myKeep)
    32_5_56_78_a267_b679_bh76_26442           5739_67503_8492_hgjmk 
                  "b679_bh76_26442"              "67503_8492_hgjmk" 
    

    排名 Regex是最受欢迎的:(在vec长度1000上测试)

    Unit: milliseconds
           expr      min       lq      mean    median        uq        max neval cld
          regex  5.39784  5.53114  5.634398  5.590711  5.664186   8.128395   100 a  
         myKeep 51.74150 52.29435 54.449057 52.555338 52.973864  76.760409   100  b 
     paste(tail 72.83538 74.05970 81.254415 74.635637 95.737676 130.356893   100   c