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

Can I get the total length of an rle object without using inverse?

假设我有一个像这样的 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

由于 rle 是一个 list 对象,lengthsvalues 作为 list 的元素,我们可以提取 lengthssum

sum(b$lengths)
#[1] 10

关于您的编辑:akrun 的回答 仍然 一般有效,您只需要稍微调整一下以适应您的 Rle 数据类型:

我不知道你在这里使用的是什么功能,但如果这是像 Bioconductor Rle S4 class 这样的东西,解决方案是

sum(s@lengths)

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

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

对于 S4vectors class Rle 你需要使用方法 runLength,它没有访问器 $length.

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