7

我想将 CIGAR 向量折叠为 CIGAR 字符串。通过 CIGAR 向量到字符串,我的意思是:

我想要一个可以转换的函数:

cigar.vector = c("M", "M", "I", "I", "M", "I", "", "M", "D", "D", "M", "I", "D", "M", "I")

对此:

cigar.string = "2M2I1M1I1M2D1M1I1D1M1I"

反之亦然。

请注意,有一个“”(空字符),不计算在内。谢谢!

4

1 回答 1

14

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
于 2013-09-23T22:11:19.590 回答