2017-02-01 50 views
0

我有很多不潔數據的形式:的R - 使用GSUB替換字符串()

abc 
abc/def 
abc/de 
abc/d 
abc/def/i j k 
abc/def/i 
abc/def/i j 

這僅僅是我想改變的數據的一部分。這是更大的一組數據的一部分。

我想將所有元素更改爲abc/def/i j k。 我已經使用了gsub()功能如下:

gsub('abc[a-z/]', 'abc/def/i j k', str) 

輸出

abc/def/i j k 
abc/def/i j k/def 
abc/def/i j k/de 
abc/def/i j k/d 

的問題是它取代了圖案的任何發生。

那裏我得到了足夠體面的結果,唯一的解決辦法是在那裏我硬編碼的所有這樣可能的選項:

gsub('abc$|abc/d$|abc/de$|abc/def/i$', 'abc/def/i j k', str) 

但是,這不會,如果有任何新的數據的變化工作。 所以我想知道是否有可能得到沒有硬編碼參數的結果。

+0

所以其他0+字符,被'abc' /'def'佔位符?否則,'^ abc [a-z /] * $'將與'sub'一起使用。 –

+1

如果我理解正確,你希望所有的元素都變成「abc/def」,那麼爲什麼不使用'rep(「abc/def」,length(str))'? –

+0

試試'sub(「(abc)[/ az] *」,「\\ 1/def」,x)'或'sub(「^(abc)[/ az] * $」,「\\ 1/def 「,x)' –

回答

2

您可以使用

x <- c("abc", "abc/def","abc/de","abc/d","abc/def/i j k","abc/def/i","abc/def/i j") 
sub("^(abc)(?:/[^/]*)?", "\\1/def", x) 
## => [1] "abc/def"  "abc/def"  "abc/def"  "abc/def"  
## [5] "abc/def/i j k" "abc/def/i"  "abc/def/i j" 

R demo

詳細

  • ^ - 字符串的開始
  • (abc) - 第1組:abc
  • (?:/[^/]*)? - 任選的組相匹配的序列:
    • / - 一個/
    • [^/]* - 比/
+1

我再次檢查。有效。謝謝。 –