【问题标题】:How to add double quotes to after a certain position in a string in R如何在R中字符串的某个位置之后添加双引号
【发布时间】:2021-07-14 20:10:03
【问题描述】:

我有一个 data.table,其中有很多行在 R 中看起来像这样:

    V1        V2       V3    V4   V5  V6  V7  V8   V9           V10
 NCBINCC    GenBank   gene  331 1008  .   -   .   gene_id=UL1   protein_id=ABV71500.1
 NCBINCC    GenBank   gene  1009 1120  .  -   .  gene_id=UL4   protein_id=ABV71520
 NCBINCC    GenBank   gene  1135 1200  .  -   .  gene_id=UL6   protein_id=ABV71525

有没有一种简单的方法可以在字符串之间添加引号(在字符串gene_id= 和protein_id= 之后),以便它们只包含不同的基因和蛋白质,如以下输出:

    V1        V2       V3    V4   V5  V6  V7  V8   V9            V10
 NCBINCC    GenBank   gene  331 1008  .   -   .   gene_id="UL1"  protein_id="ABV71500.1"
 NCBINCC    GenBank   gene  1009 1120 .   -   .  gene_id="UL4"  protein_id="ABV71520"
 NCBINCC    GenBank   gene  1135 1200 .   -   .  gene_id="UL6"  protein_id="ABV71525"

我已经看到this answer 用于 shell,但想知道是否有办法在 R 中也这样做。谢谢。

【问题讨论】:

    标签: r string dataframe data.table insertion


    【解决方案1】:

    我们可以使用str_replace 和正则表达式环视来匹配=,捕获包括. 在内的字母数字字符并替换为引用的反向引用(\\1)

    library(stringr)
    library(dplyr)
    df1 <- df1 %>%
         mutate(across(c(V9, V10), 
            ~ str_replace(., "(?<=\\=)([[:alnum:].]+)", '"\\1"')))
    

    -输出

    df1
    #  V1      V2   V3   V4   V5 V6 V7 V8            V9                     V10
    #1 NCBINCC GenBank gene  331 1008  .  -  . gene_id="UL1" protein_id="ABV71500.1"
    #2 NCBINCC GenBank gene 1009 1120  .  -  . gene_id="UL4"   protein_id="ABV71520"
    #3 NCBINCC GenBank gene 1135 1200  .  -  . gene_id="UL6"   protein_id="ABV71525"
    

    忘记使用base R对应的选项

    nm1 <- c("V9", "V10")
    df1[nm1] <- lapply(df1[nm1], function(x) 
         sub("(?<=\\=)([[:alnum:].]+)", '"\\1"', x, perl = TRUE))
    

    数据

    df1 <- structure(list(V1 = c("NCBINCC", "NCBINCC", "NCBINCC"), V2 = c("GenBank", 
    "GenBank", "GenBank"), V3 = c("gene", "gene", "gene"), V4 = c(331L, 
    1009L, 1135L), V5 = c(1008L, 1120L, 1200L), V6 = c(".", ".", 
    "."), V7 = c("-", "-", "-"), V8 = c(".", ".", "."), V9 = c("gene_id=UL1", 
    "gene_id=UL4", "gene_id=UL6"), V10 = c("protein_id=ABV71500.1", 
    "protein_id=ABV71520", "protein_id=ABV71525")), class = "data.frame",
    row.names = c(NA, 
    -3L))
    

    【讨论】:

      【解决方案2】:

      我会使用mutate 和stringr:

      require(dplyr)
      require(stringr)
      
      myTable %>%
      mutate(across(c(V9, V10),
      function(x){
      firstHalf <- str_extract(x, "^.+=") # everything up to and including the '='
      secondHalf <- str_extract(x, "(?<==).*$") # everything after the '='
      
      # Add quotes to secondHalf
      newSecondHalf <- paste0("\"", secondHalf, "\"")
      
      # Glue it all back together and spit it out
      paste0(firstHalf, newSecondHalf)
      }))
      

      【讨论】:

        【解决方案3】:

        假设有一个名为 mydatatable 的数据表,我使用了 gsub 和 paste0。

        library(dplyr)
        
        mydatatable <- mydatatable %>% 
          mutate(across(c(V9, V10), ~paste0(gsub("=", '="', .), '"')))
        

        【讨论】:

          【解决方案4】:

          如果您对包裹感到厌烦,您可能想在lapply 中尝试sub。

          v <- c('V9', 'V10')
          d[v] <- lapply(d[v], sub, pa='\\=(.*)', re='="\\1"')
          d
          #        V1      V2   V3   V4   V5 V6 V7 V8            V9                     V10
          # 1 NCBINCC GenBank gene  331 1008  .  -  . gene_id="UL1" protein_id="ABV71500.1"
          # 2 NCBINCC GenBank gene 1009 1120  .  -  . gene_id="UL4"   protein_id="ABV71520"
          # 3 NCBINCC GenBank gene 1135 1200  .  -  . gene_id="UL6"   protein_id="ABV71525"
          

          数据

          d <- read.table(header=T, text='V1        V2       V3    V4   V5  V6  V7  V8   V9           V10
          NCBINCC    GenBank   gene  331 1008  .   -   .   gene_id=UL1   protein_id=ABV71500.1
          NCBINCC    GenBank   gene  1009 1120  .  -   .  gene_id=UL4   protein_id=ABV71520
          NCBINCC    GenBank   gene  1135 1200  .  -   .  gene_id=UL6   protein_id=ABV71525')
          

          【讨论】:

          • 谢谢,这也是用 lapply 链接 sub 的一个很好的学习方法。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-07-12
          • 1970-01-01
          • 1970-01-01
          • 2012-02-19
          相关资源
          最近更新 更多