2013-09-25 3 views
3

Предположим, у меня есть следующий RLE объект:Split объект 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» и их соответствующие длины в отдельные элементы в векторе.

Обратите внимание, что все не Ns вставляются вместе, поэтому результат имеет «16M2S», а не «16M» «2S».

Что было бы самым эффективным способом сделать это?

+0

Есть ряд функций для работы с сигарами в [Bioconductor] (http://bioconductor.org) [GenomicRanges] (http://bioconductor.org/packages/release/bioc/html/GenomicRanges.html), с немного кривой обучения, но довольно обширные справочные страницы, например, '? CigarToRleList',' cigar ' –

+0

не нужно заканчивать строки точкой с запятой в R. – Frank

ответ

5

Это работает и должен быть порядочным По скорости:

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" 
Смежные вопросы