R/BioC序列处理之五:Rle和Ranges

(本文已于2015.09.08更新)

生物序列信息不仅仅指序列本身,它们还包括其他类型的信息,如基因都定位在哪些序列(染色体)上,正链还是负链,什么位置,其他数据库对应的编号是什么,有什么功能等等。下面介绍BioC中用于这些数据存储和处理的Rle和Ranges类。

1 Rle(Run Length Encoding,行程编码)

1.1 Rle类和Rle对象

序列或基因最终要定位到染色体上。序列往往数量非常巨大,但染色体数量很少,如果每条序列的染色体定位都显式标注,将会产生大量的重复信息,更糟糕的是它们要占用大量的内存。BioC的IRanges包为这些数据提供了一种简便可行的信息压缩方式,即Rle。如果染色体1-3分别有3000,5000和2000个基因,基因的染色体注释可以用字符向量表示,也可以用Rle对象表示:

library(IRanges)  ##可以不执行,载入Biostrings包将自动载入依赖包IRanges
library(Biostrings)
chr.str <- c(rep("ChrI", 3000), rep("ChrII", 5000), rep("ChrIII", 2000))
chr.rle <- Rle(chr.str)

两种方式的效果是完全一样的,但是Rle对象占用空间还不到字符向量的2%:

## Rle对象向量化后和原向量是完全相同的:
identical(as.vector(chr.rle), chr.str)
## [1] TRUE
## 对象大小(内存占用)比:
as.vector(object.size(chr.rle)/object.size(chr.str))
## [1] 0.01616283

使用Rle并不总是可以“压缩”数据。如果信息没有重复或重复量很少,Rle会占用更多的内存:

strx <- sample(DNA_BASES, 10000, replace = TRUE)
strx.rle <- Rle(strx)
as.vector(object.size(strx.rle)/object.size(strx))
## [1] 1.130721

Rle对象用两个属性来表示原向量,一个是值(values),可以是向量或因子;另一个是长度(lengths),为整型数据,表示对应位置的value的重复次数。

chr.rle
## character-Rle of length 10000 with 3 runs
##   Lengths:     3000     5000     2000
##   Values :   "ChrI"  "ChrII" "ChrIII"
getClass(class(chr.rle))
## Class "Rle" [package "S4Vectors"]
## 
## Slots:
##                                                                       
## Name:           values         lengths elementMetadata        metadata
## Class:  vectorORfactor         integer DataTableORNULL            list
## 
## Extends: 
## Class "Vector", directly
## Class "Annotated", by class "Vector", distance 2

1.2 Rle对象的处理方法

1.2.1 Rle对象构建/获取:

Rle对象可以用构造函数Rle来产生,它有两种用法:

Rle(values)
Rle(values, lengths)

values和lengths均为(原子)向量。第一种用法前面已经出现过了,我们看看第二种用法:

chr.rle <- Rle(values = c("Chr1", "Chr2", "Chr3", "Chr1", "Chr3"), lengths = c(3,
    2, 5, 4, 5))
chr.rle
## character-Rle of length 19 with 5 runs
##   Lengths:      3      2      5      4      5
##   Values : "Chr1" "Chr2" "Chr3" "Chr1" "Chr3"

原子向量也可以通过类型转换函数as由原子向量产生,它等价于上面的第一种方式:

as(chr.str, "Rle")
## character-Rle of length 10000 with 3 runs
##   Lengths:     3000     5000     2000
##   Values :   "ChrI"  "ChrII" "ChrIII"
1.2.2 获取属性:

Rle是S4类,Rle对象的属性如值、长度等可以使用属性读取函数获取:

runLength(chr.rle)
## [1] 3 2 5 4 5
runValue(chr.rle)
## [1] "Chr1" "Chr2" "Chr3" "Chr1" "Chr3"
nrun(chr.rle)
## [1] 5
start(chr.rle)
## [1]  1  4  6 11 15
end(chr.rle)
## [1]  3  5 10 14 19
width(chr.rle)
## [1] 3 2 5 4 5
1.2.3 属性替换:

Rle对象的长度和值还可以使用属性替换函数进行修改:

runLength(chr.rle) <- rep(3, nrun(chr.rle))
chr.rle
## character-Rle of length 15 with 5 runs
##   Lengths:      3      3      3      3      3
##   Values : "Chr1" "Chr2" "Chr3" "Chr1" "Chr3"
runValue(chr.rle)[3:4] <- c("III", "IV")
chr.rle
## character-Rle of length 15 with 5 runs
##   Lengths:      3      3      3      3      3
##   Values : "Chr1" "Chr2"  "III"   "IV" "Chr3"
## 替换向量和被替换向量的长度必需相同,否则出错。下面两个语句都不正确:
runValue(chr.rle) <- c("ChrI", "ChrV")
## Error in .Call2("Rle_constructor", values, lengths, check, 0L, PACKAGE = "S4Vectors"): 'length(lengths)' != 'length(values)'
runLength(chr.rle) <- 3
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值