假设数据框有许多列都说“奖金”。目标是使用附加数字唯一地重命名每个奖励列。示例数据:
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)
答案 0 :(得分:2)
据我所知,gsub
无法对每个结果运行任何类型的功能,但使用regexpr
和regmatches
可以轻松实现
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还有其他例子。