(本文已于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