2016-05-09 137 views
1

我希望在第一次出現2後最好使用基於Rregex替換所有2的字符串。這似乎是一定是重複的,但我找不到答案。首次出現後,替換字符串中的元素

下面是一個例子:

my.data <- read.table(text=' 
         my.string 
         .1.222.2.2 
         ..1..1..2. 
         1.1.2.2... 
         .222.232.. 
         ..1..1.... 
', header=TRUE, stringsAsFactors = FALSE) 
my.data 

desired.result <- read.table(text=' 
         my.string 
         .1.2...... 
         ..1..1..2. 
         1.1.2..... 
         .2....3... 
         ..1..1.... 
', header=TRUE, stringsAsFactors = FALSE) 
desired.result 

my.last.2 <- c(4, 9, 5, 2, NA) 
my.last.2 

謝謝你的任何援助。

+0

您可以發佈所需的輸出的例子嗎? –

+2

@PedroLobito我相信他的'desired.r esult'對象是期望的輸出。 – Gregor

+0

我認爲[作者](http://stackoverflow.com/a/5908655/324364)作品的變體。 – joran

回答

4

這似乎符合您需要的輸出:

> gsub(pattern = "(?<=2)(.*?)2", 
     replacement = "\\1\\.", 
     x = my.data$my.string, 
     perl = TRUE) 
[1] ".1.2......" "..1..1..2." "1.1.2....." ".2....3..." "..1..1...." 

這實際上是一種直接從this回答修改一個非常類似的問題,使其[R具體。老實說,我不太理解這個正則表達式,所以謹慎使用(並且投票)。

+0

真的不明白'*?'是什麼意思 - 我希望'(。*)'工作,如果'(。*?)'... – MichaelChirico

+0

@MichaelChirico我真的不是......編輯添加關於我的無知的警告。 – joran

+1

從[regex101](https://regex101.com/r/mR5bH0/1),差異似乎是「儘可能少的次數,根據需要擴展」('。*?')與「多次儘可能根據需要回饋「('。*')...並非我完全明白 – MichaelChirico

2

這工作,但可能是低效的:

with(my.data, gsub("@", "2", gsub("2", ".", sub("2", "@", my.string)))) 
# [1] ".1.2......" "..1..1..2." "1.1.2....." ".2....3..." "..1..1...." 

方法:使用sub只匹配第一次出現並將其更改爲@(或其他佔位符不中my.string其他地方顯示出來,然後用gsub更換所有剩餘2 s,則gsub@2

+0

一種好主意。 – sln

+0

@sin謝謝。我認爲喬蘭是要走的路,因爲它是一次完成的......我在這裏留下它的透明度,因爲我認爲它很明顯它是如何工作的 – MichaelChirico

+0

我不敢相信我被這個正則表達式愚弄了。在看了一會兒'(?<= 2)(。*?)2'後,很明顯比賽結束是在'2'之後,所以在下一場比賽中,至少後面的'(?<= 2) '滿意.. – sln

相關問題