我有一个称为myvec的向量。我想用“_”替换每个元素中的前两个点(如果存在于-之前)。如何在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

最佳答案

我们可以尝试使用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"

10-04 15:03