如何增加gsub()替换字符串?

时间:2014-06-23 14:02:45

标签: regex r gsub

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

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)

2 个答案:

答案 0 :(得分:2)

据我所知,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允许分配,因此可以轻松换出匹配的值。

答案 1 :(得分: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即可。下面,fun proto对象的p方法将应用于"bonus"的每次出现,其中count会自动递增。 proto对象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还有其他例子。