2013-09-25 55 views
3

假设我有以下RLE对象:拆分RLE对象

r = rle(c(rep("M",28),rep("N",4265),rep("M",16),rep("S",2),rep("N",400),rep("M",10))); 

而且我希望把它分解为字符串的下列载体:

a = c("28M","4265N","16M2S","400N","10M"); 

意思我分开“N”值和非“N”值及其相应的长度分成向量中的单独元素。

请注意,所有非N都粘贴在一起,这就是为什么结果有“16M2S”,而不是“16M”“2S”分开的原因。

什么是最有效的方法来做到这一点?

+0

有功能的数量与雪茄在[Bioconductor的]处理(http://bioconductor.org )[GenomicRanges](http://bioconductor.org/packages/release/bioc/html/GenomicRanges.html)包,有一点学习曲线,但有相当广泛的帮助页面,例如'?cigarToRleList','雪茄 ' –

+0

不需要在R中以分号结束行。 – Frank

回答

5

这个工作,应该是不错的speedwise:

l <- r$lengths 
v <- r$values 
s <- paste0(l, v) 
n <- v == "N" 
i <- cumsum(c(TRUE, head(n, -1) != tail(n, -1))) 

unname(vapply(split(s, i), paste, character(1), collapse = "")) 
# [1] "28M" "4265N" "16M2S" "400N" "10M" 
1

另一种可能性:

r2 <- rle(r$values == "N") 

len <- r2$lengths 

spl <- rep(seq_along(len), len) 

len2 <- split(r$lengths, spl) 

val <- split(r$values, spl) 

mapply(paste0, len2, val, collapse = "", USE.NAMES = FALSE) 
# [1] "28M" "4265N" "16M2S" "400N" "10M"