上节内容介绍了IRange
对象的创建与提取,它的数据形式虽然类似于dataframe
,实际上为IRange
对象。这种类别允许进行专门的处理操作,接下面我们学习一下对IRange
对象的运算,转换与集合的操作。
计算
计算包换+
,-
,*
(没有/
,因为没有意义)。
加法或者减法的作用是在范围的两侧对称地延伸或者缩减特定的长度(图1):
> x <- IRanges(start=c(40, 80), end=c(67, 114))
> x + 4L
IRanges of length 2
start end width
[1] 36 71 36
[2] 76 118 43
> x - 10L
IRanges of length 2
start end width
[1] 50 57 8
[2] 90 104 15
图1 加减
当乘上一个正数时,代表向内放大一定的倍数(长度减少),而乘上一个负数代表缩小一定倍数(长度增加):
> x*2
IRanges object with 2 ranges and 0 metadata columns:
start end width
<integer> <integer> <integer>
[1] 47 60 14
[2] 89 105 17
> x*-2
IRanges object with 2 ranges and 0 metadata columns:
start end width
<integer> <integer> <integer>
[1] 26 81 56
[2] 62 131 70
转换
restrict
函数生成范围的边界,强制范围落在边界内(图2):
y <- IRanges(start=c(4, 6, 10, 12), width=13)
> y
IRanges of length 4
start end width
[1] 4 16 13
[2] 6 18 13
[3] 10 22 13
[4] 12 24 13
> restrict(y, 5, 10)
IRanges of length 3
start end width
[1] 5 10 6
[2] 6 10 5
[3] 10 10 1
图2 restrict
通过flank
函数可以向范围上游提取一定长度的范围(图3):
> x
IRanges of length 2
start end width
[1] 40 67 28
[2] 80 114 35
> flank(x, width=7)
IRanges of length 2
start end width
[1] 33 39 7
[2] 73 79 7
向下游取一定长度可以修改参数start=FALSE
(图3):
> flank(x, width=7, start=FALSE)
IRanges of length 2
start end width
[1] 68 74 7
[2] 115 121 7
图3
当一个IRanges
对象存在多个范围时,通过reduce
函数可以将这些范围拍到一起,融合重叠区域,这种用法在确定read比对区域时非常有效(图4):
> set.seed(0) # set the random number generator seed
> alns <- IRanges(start=sample(seq_len(50), 20), width=5)
> head(alns, 4)
IRanges of length 4
start end width
[1] 45 49 5
[2] 14 18 5
[3] 18 22 5
[4] 27 31 5
> reduce(alns)
IRanges of length 3
start end width
[1] 3 22 20
[2] 24 36 13
[3] 40 53 14
也可以通过gaps
得到范围拍到一起之后的空白区域(可以通过这种方式寻找内含子区域,基因间区域等)(图4):
> gaps(alns)
IRanges of length 2
start end width
[1] 23 23 1
[2] 37 39 3
图4
不过gaps
函数不会返回第一个起始位点之前与最后一个终止位点之后的空白,因为它不知道你序列的起点与终点,你可以自定义来得到这些空白区域:
> gaps(alns, start = 1, end = 60)
集合操作
范围间可以使用R基本的集合操作函数:setdiff
,intersect
,union
,以此得到两个范围的交集,并集与差集(图5):
> a <- IRanges(start=4, end=13)
> b <- IRanges(start=12, end=17)
> intersect(a, b)
IRanges of length 1
start end width
[1] 12 13 2
> setdiff(a, b)
IRanges of length 1
start end width
[1] 4 11 8
> union(b, a)
IRanges of length 1
start end width
[1] 4 17 14
> union(a, b)
IRanges of length 1
start end width
[1] 4 17 14
图5
注意,如果一个对象包含多个范围并与另一个对象进行集合操作,IRanges
会先对此对象进行范围合并(等同于reduce
),因为根据集合的概念同一区域在一个集合里面只应该出现一次。
网友评论