折叠向量到字符串与相应的连续出现次数

时间:2013-09-23 22:06:49

标签: r

我想将CIGAR向量折叠为CIGAR字符串。通过CIGAR vector to String我的意思如下:

我想要一个转换函数:

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

到此:

cigar.string = "2M2I1M1I1M2D1M1I1D1M1I"

反之亦然。

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

1 个答案:

答案 0 :(得分: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