我可以在不使用逆的情况下获得rle对象的总长度吗?

时间:2016-07-26 08:46:46

标签: r run-length-encoding

让我们说我有一个像这样的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

3 个答案:

答案 0 :(得分:6)

由于rlelist对象,lengthsvalues作为list的元素,我们可以提取lengthssum

sum(b$lengths)
#[1] 10

答案 1 :(得分:2)

关于您的修改:akrun的回答仍然通常有效,您只需稍微调整一下Rle数据类型:

我不知道你在这里使用的是什么函数,但是如果它类似于Bioconductor Rle S4类,那么解决方案就是

sum(s@lengths)

也就是说,您必须使用S4插槽名称lengths,而不是嵌套名称lengths。更一般地说,您可以通过检查找出哪种解决方案有效:

  1. 对象名称来自names(obj)
  2. 或者,对于S4对象,其插槽名称为:slotNames(obj)

答案 2 :(得分:2)

对于S4vectorsRle,您需要使用方法runLength,它没有访问者$length

在上面的示例中,这变为runLength(a[[1]])