【问题标题】:Using gsub function使用 gsub 函数
【发布时间】:2021-10-05 17:46:52
【问题描述】:

我有一个具有多个级别的因子,我想在所有数据的数字之间插入一个冒号,但我不知道如何为此使用 gsub 函数。 示例我的数据如下所示:

ABCD*0801
ABCD*0701
ABCD*0902
ABCD*0311
ABCD*2001

我想要的是这个:

ABCD*08:01
ABCD*07:01
ABCD*09:02
ABCD*03:11
ABCD*20:01

我在下面使用了这段代码,但我不明白

gsub("(.{4})(.*)$", "\\1:\\2",hladata$DRB1_1)

你能帮帮我吗?

【问题讨论】:

    标签: r regex


    【解决方案1】:

    sub 有两个选项(因为每个字符串只有一个匹配项,gsub,每个字符串有多个匹配项,所以没有必要):

    sub("\\d{2}", "\\1:", x)
    

    这通过反向引用起作用:在第一个参数中匹配的模式(两个digits 的出现)被记住并在替换参数中重复,并添加一个:

    sub("(?<=\\d{2})(?=\\d{2})", ":", x, perl = TRUE)
    

    这个更复杂的解决方案适用于lookaround:lookbehind (?&lt;=\\d{2}) 在匹配的左侧查找两位数,而(?=\\d{2}) 在右侧查找两位数。在两个环视匹配的地方,插入了 :

    由于量化表达式,您使用的代码不起作用;您需要将其更改为{7},因为在您要插入: 的位置之前有七个字符。它的工作方式类似于上面的第二个选项,即通过反向引用:\\1 记住并重复在第一个捕获组(...) 中捕获的前七个字符,而第二个反向引用\\2 记住并重复第二个捕获组;在它们之间添加了:

    gsub("(.{7})(.*)$", "\\1:\\2", x)
    

    数据:

    x <- as.factor(c("ABCD*0801",
                     "ABCD*0701",
                     "ABCD*0902",
                     "ABCD*0311",
                     "ABCD*2001"))
    

    【讨论】:

      【解决方案2】:

      这应该可行:

      x <- as.factor(c("ABCD*0801",
                       "ABCD*0701",
                       "ABCD*0902",
                       "ABCD*0311",
                       "ABCD*2001"))
      
      as.factor(gsub("(\\d{2}$)",":\\1", x))
      #> [1] ABCD*08:01 ABCD*07:01 ABCD*09:02 ABCD*03:11 ABCD*20:01
      #> Levels: ABCD*03:11 ABCD*07:01 ABCD*08:01 ABCD*09:02 ABCD*20:01
      

      reprex package (v0.3.0) 于 2021-07-30 创建

      正如@Roland 在 cmets 中指出的那样,在因子 levels() 上使用 sub 效率更高。

      x <- as.factor(c("ABCD*0801",
                       "ABCD*0701",
                       "ABCD*0902",
                       "ABCD*0311",
                       "ABCD*2001"))
       
      levels(x) <- sub("(\\d{2}$)",":\\1", levels(x))
                   
      x
      #> [1] ABCD*08:01 ABCD*07:01 ABCD*09:02 ABCD*03:11 ABCD*20:01
      #> Levels: ABCD*03:11 ABCD*07:01 ABCD*08:01 ABCD*09:02 ABCD*20:01
      

      【讨论】:

      • levels(x) 上使用gsub 而不是x。这样更有效率。
      猜你喜欢
      • 2010-12-31
      • 2022-12-17
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多