Могу ли я получить общую длину объекта rle без использования обратного?

Допустим, у меня есть Rle длиной 10:

b = rle(c("H", "T", "T", "H", "H", "H", "H", "H", "T", "H"))

Как я могу получить длину этого объекта без использования inverse.rle?

length(inverse.rle(b))
# 10

У меня есть несколько разреженных Rles, представляющих хромосомы, и они могут иметь длину в сотни миллионов, поэтому я бы не стал использовать инверсию.


ответ akruns не работает на моих данных:

> a
$ mydata
numeric-Rle of length 57442693 with 12471 runs
  Lengths: 2709826     100   31062     100 ...       2     232     100      47
  Values :       0       1       0       1 ...       1       0       1       0

> a$lengths
NULL

person The Unfun Cat    schedule 26.07.2016    source источник
comment
А, есть и rle, и Rle-объект. Дальше....   -  person The Unfun Cat    schedule 26.07.2016


Ответы (3)


Поскольку rle является объектом list, а lengths и values являются элементами list, мы можем извлечь lengths и sum.

sum(b$lengths)
#[1] 10
person akrun    schedule 26.07.2016

Что касается вашего редактирования: ответ akrun все еще в целом работает, вам просто нужно немного адаптировать его к вашему типу данных Rle:

Я не знаю, какую функцию вы здесь используете, но если это что-то вроде класса Bioconductor Rle S4, решение будет таким:

sum(s@lengths)

То есть вместо вложенного имени lengths нужно использовать имя слота S4 lengths. В более общем плане вы можете узнать, какое решение работает, проверив:

  1. Имена объектов через names(obj).
  2. Или, в случае объекта S4, имена его слотов: slotNames(obj).
person Konrad Rudolph    schedule 26.07.2016

Для S4vectors класса Rle нужно использовать метод runLength, у него нет аксессора $length.

В моем примере выше это становится runLength(a[[1]]).

person The Unfun Cat    schedule 26.07.2016