【问题标题】:How can you increment a gsub() replacement string?如何增加 gsub() 替换字符串?
【发布时间】:2014-06-23 23:11:33
【问题描述】:

假设一个数据框有很多列都说“奖金”。目标是用附加的数字唯一地重命名每个奖金列。示例数据:

string  <- c("bonus", "bonus", "bonus", "bonus")
string
[1] "bonus" "bonus" "bonus" "bonus"

所需的列名输出:

[1] "bonus1" "bonus2" "bonus3" "bonus4"

假设您不知道有多少个奖励列,因此您不能简单地将 1 到该列数粘贴到每个奖励列名称。

以下方法可行,但看起来不优雅,而且编码过于硬:

bonus.count  <- nrow(count(grep(pattern = "bonus", x = string)))
string.numbered  <- paste0(string, seq(from = 1, to = bonus.count, 1)

gsub 函数(或其他基于正则表达式的函数)如何替换递增的数字?沿着

string.gsub.numbered  <- gsub(pattern = "bonus", replacement = "bonusincremented by one until no more bonuses", x = string)

【问题讨论】:

    标签: regex r gsub


    【解决方案1】:

    据我所知,gsub 不能对每个结果运行任何类型的函数,但是使用 regexprregmatches 可以很容易地做到这一点

    string  <- c("bonus", "bonus", "bonus", "bonus")
    m <- regexpr("bonus",string)
    regmatches(string,m) <- paste0(regmatches(string,m), 1:length(m))
    string
    # [1] "bonus1" "bonus2" "bonus3" "bonus4"
    

    好的部分是regmatches 允许赋值,因此很容易换出匹配的值。

    【讨论】:

      【解决方案2】:

      1)使用问题中定义的string,我们可以这样写:

      paste0(string, seq_along(string))
      

      2)如果你真正拥有的是这样的:

      string2 <- "As a bonus we got a bonus coupon."
      

      并且您想将其更改为"As a bonus1 we got a bonus2 coupon." 然后gsubfn package 中的gsubfn 可以做到这一点。下面,p 原型对象的fun 方法将应用于"bonus" 的每次出现,count 自动递增。原型对象p 在匹配之间自动保存count 的状态以允许这样做:

      library(gsubfn)
      string2 <- "As a bonus we got a bonus coupon." # test data
      
      p <- proto(fun = function(this, x) paste0(x, count))
      gsubfn("bonus", p, string2)
      

      给予:

      [1] "As a bonus1 we got a bonus2 coupon."
      

      proto vignette 中还有其他示例。

      【讨论】:

        猜你喜欢
        • 2013-08-17
        • 1970-01-01
        • 2013-09-05
        • 2021-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多