2016-05-22 62 views
3

我有這個矢量myvec。我想用「-」替換每個元素中的前兩個點(如果出現在_之前)。我如何在R中做到這一點,並得到結果?如何用條件替換前兩個匹配模式R

myvec <- c("SKDP.209.3_C4UAMACXX.7.04.ReCal.sort.bam", "SKDP.97.1_C4UAMACXX.7.12.ReCal.sort.bam", 
    "SKDP972_C4UAMACXX.7.13.ReCal.sort.bam") 

結果

SKDP-209-3_C4UAMACXX.7.04.ReCal.sort.bam, SKDP-97-1_C4UAMACXX.7.12.ReCal.sort.bam, 
    SKDP972_C4UAMACXX.7.13.ReCal.sort.bam 

回答

5

我們可以gsub嘗試。使用捕獲組即(...)中的字符,檢查另外一個字符不是.([^.]+)),後面跟着一個點(\\.,因爲.是一個元字符,可以匹配任何字符,我們需要將其轉義),然後是另一組不是一個點,然後是第三個捕獲組,其中包括一個或多個不是_的字符,然後是_([^_]+_),其餘字符直到字符串的末尾(.*),並替換爲捕獲組的反向引用,即第一個爲\\1,然後是-,然後是第二個反向引用...

gsub("^([^.]+)\\.([^.]+)\\.([^_]+_.*)", "\\1-\\2-\\3", myvec) 
#[1] "SKDP-209-3_C4UAMACXX.7.04.ReCal.sort.bam" 
#[2] "SKDP-97-1_C4UAMACXX.7.12.ReCal.sort.bam" 
#[3] "SKDP972_C4UAMACXX.7.13.ReCal.sort.bam" 
+0

謝謝。你能否在這部分解釋一下?\\ 1 - \\ 2 - \\ 3「'? – MAPK

+0

@MAPK當然,只需要一分鐘 – akrun