1范围重新审视

在Bioconductor中有两类,IRanges而且农庄,它们是表示基因组数据的标准数据结构。在整个文档中,我将这些类中的任何一个称为范围如果一个操作可以在任意一个类上执行,否则我显式地提到一个函数是否适合于IRanges农庄

范围对象可以表示整数集为IRanges(具有开始、结束和宽度属性)或表示基因组间隔(具有附加属性、序列名称和链)为农庄.此外,两种类型的范围可以将关于它们的间隔的信息存储为元数据列(例如基因组间隔上的GC内容)。

范围对象遵循整齐数据原则:数组中的每一行范围对象对应于一个区间,而每一列将表示关于该区间的一个变量,通常每个对象将表示一个观察单元(如基因注释)。

因此,范围对象为基因组数据的推理提供了强有力的表示。在这个小插图中,您将了解更多关于范围对象以及如何通过分组、限制和汇总来执行常见的数据任务。

2构建范围

构建一个IRanges我们要求至少有两列分别表示开始坐标、结束坐标或间隔的宽度。

suppressPackageStartupMessages(library(plyranges)) set.seed(100) df <- data.frame(start=c(2:- 1,13:15), width=c(0:3, 2:0)) #生成IRanges rng <- df %>% as_iranges() rng
## IRanges对象,包含7个范围和0个元数据列:##起始结束宽度##    ## [1] 2 1 0 ## [2] 1 1 1 2 ## [5] 13 14 2 ## [6] 14 14 1 ## [7] 15 14 0

要构造一个农庄我们需要一个列来表示序列名(contig或染色体id),以及一个可选列来表示间隔的链性。

# seqname对于GRanges是必需的,元数据被自动保留grng <- df %>% transform(seqnames = sample(c("chr1", "chr2"), 7, replace = TRUE), strand = sample(c("+", "-"), 7, replace = TRUE), gc = runif(7)) %>% as_granges() grng
与7 # #农庄对象范围和1元数据列:gc # # # # seqnames范围链| < Rle > < IRanges > < Rle > | <数字> # # [1]chr2 2 - 0.762551 | # # [2] chr1 1 - 0.669022 | # # [3] chr2 0 - 1 + | 0.204612 # # [4] chr2 1:1 - | 0.357525 # # [5] chr1 13 - 14日- | 0.359475 # # [6]chr1 14 - 0.690291 | # # [7] chr2 15:14 - | 0.535811  ## ------- ## seqinfo: 2从一个未指明的基因组序列;没有seqlengths

3.范围上的算术

有时你想要修改基因组区间,方法是改变区间的宽度,同时保持坐标的开始、结束或中点不变。这是通过变异动词withanchor_ *副词。

锚定的动作固定对象的开始、结束、中心坐标范围对象,如下图和代码所示,锚可以与任意一个组合使用变异拉伸.默认情况下,开始坐标将被锚定,所以不管链。对于类似于GenomicRanges:调整,使用anchor_5p

rng < - as_iranges (data.frame(开始= c(1、2、3),结束= c(5、2、8)))grng < - as_granges (data.frame(开始= c(1、2、3),结束= c(5、2、8),seqnames =“seq1链= c ("+", "*", "-"))) 变异(rng宽度= 10)
## IRanges对象,包含3个范围和0个元数据列:##开始结束宽度##    ## [1] 1 10 10 ## [2] 2 11 10 ## [3] 3 12 10
改变(anchor_start(rng), width = 10)
## IRanges对象,包含3个范围和0个元数据列:##开始结束宽度##    ## [1] 1 10 10 ## [2] 2 11 10 ## [3] 3 12 10
改变(anchor_end(rng), width = 10)
## IRanges对象,3个范围,0个元数据列:##开始结束宽度##    ## [1] -4 5 10 ## [2] -7 2 10 ## [3] -1 8 10
修改(anchor_center(rng), width = 10)
## IRanges对象,包含3个范围和0个元数据列:##起始结束宽度##    ## [1] -2 7 10 ## [2] -3 6 10 ## [3] 1 10 10 10
改变(anchor_3p(grng),宽度= 10)#保留负链固定
## seqnames ranges strand ##    ## [1] seq1 -4-5 + ## [2] seq1 -7-2 * ## [3] seq1 3-12 - ## ------- ## seqinfo:来自未指定基因组的1个序列;没有seqlengths
突变(anchor_5p(grng), width = 10) #保持正链固定
## seqnames ranges strand ##    ## [1] seq1 1-10 + ## [2] seq1 2-11 * ## [3] seq1 -1-8 - ## ------- ## seqinfo:来自未指定基因组的1个序列;没有seqlengths

类也可以修改间隔的宽度拉伸动词。在没有锚定的情况下,这个函数将在任意一个方向上将间隔延长一个整数。通过锚定,可以保留起点、终点或中点。

Rng2 <- stretch(anchor_center(rng), 10) Rng2
## IRanges对象,包含3个范围和0个元数据列:##起始结束宽度##    ## [1] -4 10 15 ## [2] -3 7 11 ## [3] -2 13 16
拉伸(anchor_end (rng2), 10)
## IRanges对象,3个范围和0个元数据列:##开始结束宽度##    ## [1] -14 10 25 ## [2] -13 7 21 ## [3] -12 13 26
拉伸(anchor_start (rng2), 10)
## IRanges对象,3个范围和0个元数据列:##开始结束宽度##    ## [1] -4 20 25 ## [2] -3 17 21 ## [3] -2 23 26
拉伸(anchor_3p (grng), 10)
## seqnames ranges strand ##    ## [1] seq1 -9-5 + ## [2] seq1 -8-2 * ## [3] seq1 3-18 - ## ------- ## seqinfo:来自未指定基因组的1个序列;没有seqlengths
拉伸(anchor_5p (grng), 10)
## seqnames ranges strand ##    ## [1] seq1 1-15 + ## [2] seq1 2-12 * ## [3] seq1 -7-8 - ## ------- ## seqinfo:来自未指定基因组的1个序列;没有seqlengths

范围可左移或右移。如果链信息可用,我们也可以转移上游或下游。

shift_left (rng, 100)
##开始结束宽度##    ## [1] -99 -95 5 ## [2] -98 -98 1 ## [3] -97 -92 6
shift_right (rng, 100)
##开始结束宽度##    ## [1] 101 105 5 ## [2] 102 102 1 ## [3] 103 108 6
shift_upstream (grng, 100)
## seqnames ranges strand ##    ## [1] seq1 -99- 95 + ## [2] seq1 -98 * ## [3] seq1 103-108 - ## ------- ## seqinfo: 1个来自未指定基因组的序列;没有seqlengths
shift_downstream (grng, 100)
## seqnames ranges strand ##    ## [1] seq1 101-105 + ## [2] seq1 102 * ## [3] seq1 -97- 92 - ## ------- ## seqinfo:来自未指定基因组的1个序列;没有seqlengths

4分组范围

plyranges引入了一个新的类范围被称为RangesGrouped,这是一个类似于分组的想法data.frame \宠物猫dplyr

对象的元数据列或核心组件都可以进行分组范围对象。

当它与其他动词连用时最有效变异()总结()filter ()reduce_ranges ()disjoin_ranges ()

grng <- data.frame(seqnames = sample(c("chr1", "chr2"), 7, replace = TRUE), strand = sample(c("+", "-"), 7, replace = TRUE), gc = runif(7), start = 1:7, width = 10) %>% as_granges() grng_by_strand <- grng %>% group_by(strand) grng_by_strand
与7 # #农庄对象范围和1元数据列:# #组:链[2]链| gc # # # # seqnames范围< Rle > < IRanges > < Rle > | <数字> # # [1]chr2 1 - 10 - 0.889454 | # # [2] chr2 2 - 11 + | 0.180407 # # [3] chr1 3 - 12 - 0.629391 | # # [4] chr2 42 + | 0.989564 # # [5] chr1为5 - 14 - 0.130289 | # # [6]chr1 6 - 15 - 0.330661 | # # [7] chr2 7 - 16 - 0.865121 |  ## ------- ## seqinfo: 2从一个未指明的基因组序列;没有seqlengths

5限制范围

动词过滤器可用于限制范围.注意,分组将导致过滤器在每组数据中进行操作。

GRNG %>% filter(gc < 0.3)
## seqnames ranges strand | gc ##    |  ## [1] chr2 2-11 + | 0.180407 ## [2] chr1 5-14 - | 0.130289 ## ------- ## seqinfo: 2个来自未指定基因组的序列;没有seqlengths
#通过组grng_by_strand %>% filter(gc == max(gc))
##组:strand [2] ## seqnames ranges strand | gc ##    |  ## [1] chr2 1-10 | 0.889454 ## [2] chr2 4-13 + | 0.989564 ## ------- # seqinfo: 2个来自未指定基因组的序列;没有seqlengths

我们还提供了方便的方法filter_by_overlaps而且filter_by_non_overlaps通过任何重叠来限制范围

Ir0 <- data.frame(start = c(5,10, 15,20), width = 5) %>% as_iranges() ir1 <- data.frame(start = 2:6, width = 3:7) %>% as_iranges() Ir0
## IRanges对象,4个范围和0个元数据列:##开始结束宽度##    ## [1] 5 9 5 ## [2] 10 14 5 ## [3] 15 19 5 ## [4] 20 24 5
ir1
## IRanges对象,5个范围和0个元数据列:##起始结束宽度##    ## [1] 2 4 3 ## [2] 3 6 4 ## [3] 4 8 5 ## [4] 5 10 6 ## [5] 6 12 7
Ir0 %>% filter_by_overlap (ir1)
##开始结束宽度##    ## [1] 5 9 5 ## [2] 10 14 5
Ir0 %>%过滤by_non_overlapped (ir1)
##开始结束宽度##    ## [1] 15 19 5 ## [2] 20 24 5

6总结范围

总结函数将返回一个DataFrame因为信息需要返回一个范围对象丢失。使用它通常是最有用的总结()结合group_by ()函数族。

Ir1 <- Ir1 %>% mutate(gc = runif(length(.)) ir0 %>% group_by_overlaps(Ir1) %>% summarise(gc = mean(gc))
##数据帧的2行2列##查询gc ## <整数> <数字> ## 1 1 0.675555 ## 2 2 0.635795

7连接,或者另一种看待重叠的方法范围

一个连接作用于两个grange对象,一个查询和一个主题。

查询< - data.frame (seqnames =“chr1链= c ("+", "-"), 开始= c(1、9),结束= c(7, 10),钥匙。字母a = [1:2]) % > % as_granges () < - data.frame主题(seqnames =“chr1链= c ("-", "+"), 开始= c(2,6),结束= c(4、8)键。b = LETTERS[1:2]) %>% as_granges()
查询和主题范围

图1:查询和主题范围

连接操作符是关系型的,因为来自查询和主题范围的元数据保留在连接范围中。中的所有连接运算符plyrangesDSL根据范围的重叠或接近生成一组命中值,并使用这些命中值以不同的方式合并两个数据集。支持四种匹配算法:重叠最近的之前,遵循.我们可以通过查询是否完整来进一步限制匹配主题,并添加导演Suffix确保匹配范围具有相同的方向(链)。

第一个函数,join_overlap_intersect ()将返回一个范围对象,其中开始、结束和宽度坐标对应于左输入和右输入之间的任何重叠量范围.如果主题与查询重叠,它还返回主题范围中的任何元数据。

Intersect_rng <- join_overlap_intersect(查询,主题)Intersect_rng
##具有2个范围和2个元数据列的GRanges对象:## seqnames ranges一个密钥。b# #    |   ## [1] chr1 2-4 + | a [2] chr1 6-7 + | a b# # ------- # seqinfo: 1个来自未指定基因组的序列;没有seqlengths
交叉连接

图2:交叉连接

join_overlap_inner ()函数将返回范围在查询中重叠任何范围在主题上。就像join_overlap_intersect ()主体的功能元数据范围如果与查询重叠,则返回。

Inner_rng <- join_overlap_inner(查询,主题)Inner_rng
##具有2个范围和2个元数据列的GRanges对象:## seqnames ranges一个密钥。b# #    |   ## [1] chr1 1-7 + | a [2] chr1 1-7 + | a b# # ------- # seqinfo: 1个来自未指定基因组的序列;没有seqlengths
内连接

图3:内连接

我们还提供了一个方便的方法find_overlaps计算的结果和join_overlap_inner ()

find_overlaps(查询、主题)
##具有2个范围和2个元数据列的GRanges对象:## seqnames ranges一个密钥。b# #    |   ## [1] chr1 1-7 + | a [2] chr1 1-7 + | a b# # ------- # seqinfo: 1个来自未指定基因组的序列;没有seqlengths

join_overlap_left ()方法将执行左外连接。

首先,找到的任何重叠将返回类似于join_overlap_inner ().然后将返回任何不重叠的范围,在元数据列上缺少值。

Left_rng <- join_overlap_left(查询,主题)Left_rng
##具有3个范围和2个元数据列的GRanges对象:## seqnames ranges一个密钥。b# #    |   ## [1] chr1 1-7 + | a [2] chr1 1-7 + | a b[3] chr1 9-10 - | b  ## ------- # seqinfo: 1个来自未指定基因组的序列;没有seqlengths
左连接

图4:左连接

相比之下,filter_by_overlaps ()上面,重叠左连接展开范围给出关于查询上每个间隔的信息范围在这个问题上有重叠范围还有左边的区间不与右边的区间重叠。

7.1寻找你的邻居

我们还提供了查找最近、前面或后面的方法范围.从概念上讲,这与我们寻找重叠的方法相同,只是连接的语义不同。

join_nearest (ir0 ir1)
## IRanges对象,4个范围和1个元数据列:##开始结束宽度| gc ##    |  ## [1] 59 5 | 0.780359 ## [2] 10 14 5 | 0.780359 ## [3] 15 19 5 b| 0.780359 ## [4] 20 24 5 | 0.780359
join_follow (ir0 ir1)
##开始结束宽度| gc ##    |  ## [1] 59 5 | 0.777584 ## [2] 10 14 5 | 0.603324 ## [3] 15 19 5 b| 0.780359 ## [4] 20 24 5 | 0.780359
join_prior (ir0, ir1) #没有任何前置将返回空的' Ranges '
## IRanges对象,0范围和1元数据列:##开始结束宽度| gc ##    | 
join_precede (ir1 ir0)
## IRanges对象,5个范围和1个元数据列:##开始结束宽度| gc ##    |  ## [1] 24 3 | 0.777584 ## [2] 3 6 4 b| 0.827303 ## [3] 4 8 5 | 0.603324 ## [4] 5 10 6 | 0.491232 ## [5] 6 12 7 | 0.780359

7.2示例:处理多映射

此示例取自Bioconductor支持网站

我们有两个范围对象。第一个包含与强度测量(如ChiP-seq实验)相对应的单核苷酸位置,而另一个包含感兴趣的两个基因的坐标。

我们想要确定强度范围重叠基因,其中每一行对应的位置重叠一个单一的基因。

首先我们创建两个范围对象

强度<- data.frame(seqnames = "VI", start = c(3320:3321,3330:3331,3341:3342), width = 1) %>% as_granges()强度
## seqnames ranges strand ##    ## [1] VI 3320 * ## [2] VI 3321 * ## [3] VI 3330 * ## [4] VI 3331 * ## [5] VI 3341 * ## [6] VI 3342 * ## ------- ## seqinfo: 1个来自未指定基因组的序列;没有seqlengths
genes <- data.frame(seqnames = "VI", start =c(3322,3030), end =c(3846,3338), gene_id=c("YFL064C", "YFL065C")) %>% as_granges()基因
## seqnames ranges strand | gene_id ##    |  ## [1] VI 3322-3846 * | yfl064c# # [2] VI 3030-3338 * | yfl065c# # ------- # seqinfo: 1个来自未指定基因组的序列;没有seqlengths

现在要找出每个基因重叠的位置,我们可以执行重叠连接。这将自动携带gene_id信息以及它们的坐标(我们可以通过只选择gene_id来删除这些信息)。

Olap <- join_overlap_inner(intensity, genes) %>% select(gene_id) Olap
与8 # #农庄对象范围和1元数据列:# # seqnames范围链| gene_id # # < Rle > < IRanges > < Rle > | <人物> # # [1]VI 3320 * | YFL065C # # [2] VI 3321 * | YFL065C # # [3] VI 3330 * | YFL065C # # [4] VI 3330 * | YFL064C # # [5] VI 3331 * | YFL065C # # [6] VI 3331 * | YFL064C # # [7] VI 3341 * | YFL064C # # [8] VI 3342 * | YFL064C  ## ------- ## seqinfo: 1从一个未指明的基因组序列;没有seqlengths

有几个位置与两个基因都匹配。我们可以计算他们使用了多少总结和分组开始位置:

Olap %>% group_by(start) %>% summary (n = n())
## DataFrame与6行2列##开始n ## <整数> <整数> ## 1 3320 1 ## 2 3321 1 ## 3 3330 2 ## 4 3331 2 ## 5 3341 1 ## 6 3342 1 ## 1

7.3按重叠分组

也可以通过重叠来分组。使用这种方法,我们可以计算出大于0的重叠数。

Grp_by_olap <- ir0 %>% group_by_overlaps(ir1) Grp_by_olap . Grp_by_olap <- ir0 %>% group_by_overlaps(ir1
##组:query [2] ## start - end width b| gc query ##    |   [1] 59 5 | 0.827303 1 ## | 9 5 | 0.603324 1 ## [5] 9 5 | 0.491232 1 ## [4] 59 5 | 0.780359 1 ## [5] 10 14 5 | 0.491232 2 ## [6] 10 14 5 | 0.780359 2
Grp_by_olap %>%突变(n_overlaps = n())
与6和3 # # IRanges对象元数据列:[2]# # # #组:查询开始结束宽度| gc查询n_overlaps # # <整数> <整数> <整数> | <数字> <整数> <整数> # # [1]5 9 5 | 0.827303 1 4 # # [2]5 9 5 | 0.603324 1 4 # # [3]5 9 5 | 0.491232 1 4 # # [4]5 9 5 | 0.780359 1 4 # # [5]10 14 5 | 0.491232 2 2 # # [6]10 14 5 | 0.780359 2 2

当然,我们也可以通过count_overlaps ()函数。

Ir0 %>%突变(n_overlaps = count_overlaps(。, ir1))
## IRanges对象,4个范围和1个元数据列:##起始结束宽度| n_overlaps ##    |  ## [1] 5 9 5 | 4 ## [2] 10 14 5 | 2 ## [3] 15 19 5 b| 0 ## [4] 20 24 5 | 0

8数据导入/输出

我们通过提供方便功能rtracklayer而且GenomicAlignments用于读取/写入以下数据格式范围对象。

plyranges功能 文件格式
read_bam () BAM
read_bed ()/write_bed () 床上
read_bed_graph ()/write_bed_graph () BEDGraph
read_narrowpeaks ()/write_narrowpeaks () narrowPeaks
read_gff ()/write_gff () 人造石铺地面/ GTF (1 - 3)
read_bigwig ()/write_bigwig () 有重大影响的人
read_wig ()/write_wig () 假发

9学习更多

还有许多其他资源和研讨会可供学习使用plyranges和相关的Bioconductor软件包,特别是更现实的分析比这里涵盖:

10附录

sessionInfo ()
## R版本4.2.0 RC (2022-04-19 r82224) ##平台:x86_64-pc-linux-gnu(64位)##运行在Ubuntu 20.04.4 LTS ## ##矩阵产品:默认## BLAS: /home/biocbuild/bbs-3.15-bioc/R/lib/libRblas。/home/biocbuild/bbs-3.15-bioc/R/lib/libRlapack。所以## ## locale: ## [1] LC_CTYPE=en_US。UTF-8 LC_NUMERIC= c# # [3] LC_TIME=en_GB LC_COLLATE= c# # [5] LC_MONETARY=en_US。utf - 8 LC_MESSAGES = en_US。UTF-8 ## [7] LC_PAPER=en_US。UTF-8 LC_NAME= c# # [9] LC_ADDRESS=C lc_phone = c# # [11] LC_MEASUREMENT=en_US。UTF-8 LC_IDENTIFICATION=C ## ##附加的基础包:## [1]stats4 stats graphics grDevices utils datasets methods ##[8]基础## ##其他附加包:## [1]ggplot2_3.3.5 plyranges_1.16.0 GenomicRanges_1.48.0 ## [4] GenomeInfoDb_1.32.0 IRanges_2.30.0 S4Vectors_0.34.0 ## [7] BiocGenerics_0.42.0 BiocStyle_2.24.0 ## ##通过命名空间加载(且未附加):# # # # [1] MatrixGenerics_1.8.0 Biobase_2.56.0 [3] sass_0.4.1 jsonlite_1.8.0 # # [5] bslib_0.3.1 assertthat_0.2.1 # # [7] BiocManager_1.30.17 highr_0.9 # # [9] GenomeInfoDbData_1.2.8 Rsamtools_2.12.0 # # [11] yaml_2.3.5 pillar_1.7.0 # # [13] lattice_0.20-45 glue_1.6.2 # # [15] digest_0.6.29 XVector_0.36.0 # # [17] colorspace_2.0-3 htmltools_0.5.2 # # [19] Matrix_1.4-1 xml_3.99 - 0.9 # # [21] pkgconfig_2.0.3 magick_2.7.3 # # [23] bookdown_0.26 zlibbioc_1.42.0 # # [25] purrr_0.3.4 scales_1.2.0 # # [27][39] tools_4.2.0 BiocIO_1.6.0 ## [41] lifecycle_1.0.1 matrixStats_0.62.0 ## [43] string_1 .4.0 munsell_0.5.0 ## [45] DelayedArray_0.22.0 Biostrings_2.64.0 ## [49] rlang_1.0.2 grid_4.2.0 ## b[31] RCurl_1.98-1.6 rjson_0.2.21 ## [53][61] knitr_1.38 dplyr_1.0.8 ## [63] rtracklayer_1.56. 6.0 fastmap_1.1.0 ## [65] utf8_1.2.2 stringi_1.7.6 ## [67] Rcpp_1.0.8.3 parallel_4.2.0 ## [69] vctrs_0.4.1 tidyselect_1.1.2 ## [71] xfun_0.30 .30