【问题标题】:Remove any characters before "_" [duplicate]删除“_”之前的所有字符[重复]
【发布时间】:2021-11-29 10:11:43
【问题描述】:

如何删除“_”之前的任何字符和数字;例如:

> char <- c("SRR04_d3_GCTCGGTAAGCACCTCGCCACATA","SRR04_d1_ACTCGGTAAGCACCTCGCCACATA",
+           "JH-HL_GCTCGGTAAGCATGTCGCCACATA","HZ04_d5_GCTCGGTAAGCACCTCGCCACATA")
> c("GCTCGGTAAGCACCTCGCCACATA","ACTCGGTAAGCACCTCGCCACATA",
+           "GCTCGGTAAGCATGTCGCCACATA","GCTCGGTAAGCACCTCGCCACATA")
[1] "GCTCGGTAAGCACCTCGCCACATA" "ACTCGGTAAGCACCTCGCCACATA" "GCTCGGTAAGCATGTCGCCACATA"
[4] "GCTCGGTAAGCACCTCGCCACATA"

我可以使用来自tidyversestr_replace 函数来做到这一点

【问题讨论】:

    标签: r string tidyverse


    【解决方案1】:

    我们可以使用来自base Rtrimws

    trimws(char, whitespace = ".*_")
    [1] "GCTCGGTAAGCACCTCGCCACATA" "ACTCGGTAAGCACCTCGCCACATA" 
    [3] "GCTCGGTAAGCATGTCGCCACATA" "GCTCGGTAAGCACCTCGCCACATA"
    

    【讨论】:

      【解决方案2】:

      这是另一种方法:

      library(stringr)
      str_replace_all(char, ".*_(?=[^:]+$)", "")
      

      输出:

      [1] "GCTCGGTAAGCACCTCGCCACATA" "ACTCGGTAAGCACCTCGCCACATA" "GCTCGGTAAGCATGTCGCCACATA"
      [4] "GCTCGGTAAGCACCTCGCCACATA"
      

      【讨论】:

        【解决方案3】:

        基础 R:

        或者使用strsplitsapply

        > sapply(strsplit(char, '_'), tail, n=1)
        [1] "GCTCGGTAAGCACCTCGCCACATA" "ACTCGGTAAGCACCTCGCCACATA" "GCTCGGTAAGCATGTCGCCACATA" "GCTCGGTAAGCACCTCGCCACATA"
        > 
        

        【讨论】:

          【解决方案4】:

          我会使用gsub[^\W_]+_ 模式来表达您的问题。这将针对一个或多个字母数字字符 下划线,任意次数。

          char <- c("SRR04_d3_GCTCGGTAAGCACCTCGCCACATA","SRR04_d1_ACTCGGTAAGCACCTCGCCACATA",
                "JH-HL_GCTCGGTAAGCATGTCGCCACATA","HZ04_d5_GCTCGGTAAGCACCTCGCCACATA")
          output <- gsub("[^\\W_]+_", "", char)
          output
          
          [1] "GCTCGGTAAGCACCTCGCCACATA" "ACTCGGTAAGCACCTCGCCACATA"
          [3] "GCTCGGTAAGCATGTCGCCACATA" "GCTCGGTAAGCACCTCGCCACATA"
          

          【讨论】:

            【解决方案5】:

            stringr可用于提取字符串末尾的所有字母:

            library(stringr)
            str_extract(char, "[[:alpha:]]*$")
            # [1] "GCTCGGTAAGCACCTCGCCACATA" "ACTCGGTAAGCACCTCGCCACATA" "GCTCGGTAAGCATGTCGCCACATA"
            # [4] "GCTCGGTAAGCACCTCGCCACATA"
            

            【讨论】:

              【解决方案6】:

              您可以使用sub 执行此操作-

              sub('.*_', '', char)
              
              #[1] "GCTCGGTAAGCACCTCGCCACATA" "ACTCGGTAAGCACCTCGCCACATA"
              #[3] "GCTCGGTAAGCATGTCGCCACATA" "GCTCGGTAAGCACCTCGCCACATA"
              

              或者,如果您更喜欢 stringr 函数。

              stringr::str_remove(char, '.*_')
              stringr::str_replace(char, '.*_', '')
              

              【讨论】:

              • 这删除了 ​​_ 我不是 100% 确定 OP 想要那个。他之前说过。如果他不这样做,那么 sub 或 str_replace 中的 '' 可以是 '_'。在示例数据中有一个形式为“sometext_moretext_lasttext”的字符串,OP 想要什么结果? moretext_lasttext 或只是 lasttext - 检查你得到你想要/期望的东西
              猜你喜欢
              • 2017-04-12
              • 1970-01-01
              • 1970-01-01
              • 2012-03-08
              • 2011-10-12
              • 2021-11-29
              • 1970-01-01
              • 1970-01-01
              • 2016-08-09
              相关资源
              最近更新 更多