【问题标题】:Remove part of string with multiple occurences inside cell删除单元格内多次出现的字符串部分
【发布时间】:2023-02-24 01:21:57
【问题描述】:

我有以下数据框:

bla = data.frame(mycol = "bla_v2_2072|ID:61462952|;bla_v2_0113|ID:61460993|")

我想删除第一个“|”之后的所有内容,但该单元格基本上包含两个由“;”分隔的子字符串。

现在,我试过了

gsub("\\|.*","",bla$mycol)

这给了我bla_v2_2072,但我期望的是

bla_v2_2072;bla_v2_0113

【问题讨论】:

    标签: r regex string gsub


    【解决方案1】:

    我们可能会使用

    library(dplyr)
    library(tidyr)
    library(stringr)
    bla %>% 
      mutate(rn = row_number()) %>% 
      separate_longer_delim(mycol, delim = ";") %>% 
       reframe(mycol = str_c(str_remove(mycol, "\|.*"), 
       collapse = ";"), .by = 'rn') %>%
      select(-rn)
    

    -输出

                       mycol
    1 bla_v2_2072;bla_v2_0113
    

    或者使用base R

    gsub("(\w+)(\|ID:\d+\|)", "\1", bla$mycol)
    [1] "bla_v2_2072;bla_v2_0113"
    

    【讨论】:

      【解决方案2】:

      使用gsub()

      bla$mycol <- gsub("(\|.*?(?=;))|(\|[^;]*$)", "", bla$mycol, perl = TRUE)
      

      或者在 tidyverse 中使用相同的正则表达式模式:

      library(dplyr)
      library(stringr)
      
      bla %>% 
        mutate(mycol = str_remove_all(mycol, "(\|.*?(?=;))|(\|[^;]*$)"))
      

      结果:

                          mycol
      1 bla_v2_2072;bla_v2_0113
      

      解释:

      "(\|.*?(?=;))              # literal '|' and following characters up to next ';'
                    |             # or
                     (\|[^;]*$)" # literal '|' through end of string if no intervening ';'
      

      【讨论】:

        【解决方案3】:
        gsub("\|[^|]+\|", "", bla$mycol)
        #> [1] "bla_v2_2072;bla_v2_0113"
        

        模式解释:转义“|”其次是一切不是“|”至少一次然后再一个“|”

        【讨论】:

        • 为什么要投反对票?
        【解决方案4】:

        您可以先用“;”分隔字符串然后删除“|”之后的所有内容。最后,使用paste0 将它们连接起来。

        > paste0(sub("\|.*","", unlist(strsplit(bla$mycol, split=";"))), collapse = "; ")
        [1] "bla_v2_2072; bla_v2_0113"
        

        【讨论】:

        • 是的,我明白了,但是他们又需要用;连接起来
        • @Saraha 我更新了我的答案。
        猜你喜欢
        • 1970-01-01
        • 2021-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-08
        • 2020-06-16
        • 1970-01-01
        相关资源
        最近更新 更多