2014-06-23 83 views
1

假設一個數據框有很多列都說「獎金」。目標是用附加號碼唯一地重命名每個獎勵列。示例數據:如何增加一個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

據我所知線,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 packagegsubfn可以做到這一點。以下,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額外exxamples。