plyranges 1.16.0
范围
重新审视在Bioconductor中有两类,IRanges
而且农庄
,它们是表示基因组数据的标准数据结构。在整个文档中,我将这些类中的任何一个称为范围
如果一个操作可以在任意一个类上执行,否则我显式地提到一个函数是否适合于IRanges
或农庄
.
范围
对象可以表示整数集为IRanges
(具有开始、结束和宽度属性)或表示基因组间隔(具有附加属性、序列名称和链)为农庄
.此外,两种类型的范围
可以将关于它们的间隔的信息存储为元数据列(例如基因组间隔上的GC内容)。
范围
对象遵循整齐数据原则:数组中的每一行范围
对象对应于一个区间,而每一列将表示关于该区间的一个变量,通常每个对象将表示一个观察单元(如基因注释)。
因此,范围
对象为基因组数据的推理提供了强有力的表示。在这个小插图中,您将了解更多关于范围
对象以及如何通过分组、限制和汇总来执行常见的数据任务。
范围
构建一个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
有时你想要修改基因组区间,方法是改变区间的宽度,同时保持坐标的开始、结束或中点不变。这是通过变异
动词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
范围
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
范围
动词过滤器
可用于限制范围
.注意,分组将导致过滤器
在每组数据中进行操作。
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
范围
的总结
函数将返回一个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
范围
一个连接作用于两个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()
连接操作符是关系型的,因为来自查询和主题范围的元数据保留在连接范围中。中的所有连接运算符plyranges
DSL根据范围的重叠或接近生成一组命中值,并使用这些命中值以不同的方式合并两个数据集。支持四种匹配算法:重叠,最近的,之前,遵循.我们可以通过查询是否完整来进一步限制匹配在主题,并添加导演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
的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
我们还提供了一个方便的方法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
相比之下,filter_by_overlaps ()
上面,重叠左连接展开范围
给出关于查询上每个间隔的信息范围
在这个问题上有重叠范围
还有左边的区间不与右边的区间重叠。
我们还提供了查找最近、前面或后面的方法范围
.从概念上讲,这与我们寻找重叠的方法相同,只是连接的语义不同。
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
此示例取自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
也可以通过重叠来分组。使用这种方法,我们可以计算出大于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
我们通过提供方便功能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 () |
假发 |
还有许多其他资源和研讨会可供学习使用plyranges
和相关的Bioconductor软件包,特别是更现实的分析比这里涵盖:
plyranges
分析公开的基因组数据。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