我想将 CIGAR 向量折叠为 CIGAR 字符串。通过 CIGAR 向量到字符串,我的意思是:
我想要一个可以转换的函数:
cigar.vector = c("M", "M", "I", "I", "M", "I", "", "M", "D", "D", "M", "I", "D", "M", "I")
对此:
cigar.string = "2M2I1M1I1M2D1M1I1D1M1I"
反之亦然。
请注意,有一个“”(空字符),不计算在内。谢谢!
我想将 CIGAR 向量折叠为 CIGAR 字符串。通过 CIGAR 向量到字符串,我的意思是:
我想要一个可以转换的函数:
cigar.vector = c("M", "M", "I", "I", "M", "I", "", "M", "D", "D", "M", "I", "D", "M", "I")
对此:
cigar.string = "2M2I1M1I1M2D1M1I1D1M1I"
反之亦然。
请注意,有一个“”(空字符),不计算在内。谢谢!
rle
这里似乎是显而易见的选择:
rcv <- rle(cigar.vector[cigar.vector!=""])
paste0(rcv$lengths,rcv$values,collapse="")
#[1] "2M2I1M1I1M2D1M1I1D1M1I"
如果你想变得花哨,你也可以利用rle
给出长度为 2 的列表的事实:
paste(do.call(rbind,rle(cigar.vector[cigar.vector!=""])),collapse="")
#[1] "2M2I1M1I1M2D1M1I1D1M1I"
如果只给出结果(在上面分配给 ),就不可能倒退result
,因为它已经丢失了""
案例的信息。排除这些情况,您可以通过以下方式获得足够接近:
backwards <- rep(
unlist(strsplit(result,"\\d+"))[-1],
as.numeric(unlist(strsplit(result,"[^0-9]")))
)
identical(cigar.vector[cigar.vector!=""],backwards)
#[1] TRUE