包:AnnotationFilter
作者: Martin Morgan [aut], Johannes Rainer [aut], Joachim Bargsten [ctb], Daniel Van Twisk [ctb], Bioconductor包装维护员[cre]
最后修改:2022-04-26 14:19:43
编译: Tue Apr 26 15:58:20 2022
在Bioconductor中有各种各样的注释资源。访问这些数据库甚至单个表的全部内容在计算上是昂贵的,而且在许多情况下不是必需的,因为用户可能只想提取数据的子集,例如单个基因的基因组坐标。在这方面,在数据提取之前过滤注释资源对性能有重大影响,并增加了这种基因组规模数据库的可用性。
的AnnotationFilter包因此被开发来提供基本的筛选类,以支持Bioconductor注释资源的公共筛选框架。AnnotationFilter为注释数据库中一些最常用的功能定义筛选器类,例如象征或genename.每个筛选器类都应该在单个数据库表列上工作,以便于对提供的值进行筛选。这样的筛选器类使用户能够构建复杂的查询来检索特定的注释,而不需要知道列名或表名或底层数据库的布局。虽然最初被开发用于Organism.dplyr而且ensembldb包、过滤器类和相关的过滤概念也可以很容易地添加到其他注释包中。
所有筛选器类都扩展了基本的AnnotationFilter
上课,选一个或多个值和一个条件允许对单个数据库表列进行筛选。根据输入值的类型,过滤器类分为:
CharacterFilter
:需要一个字符
长度为>= 1,支持条件= =
,! =
,startsWith
而且endsWith
.一个例子是GeneIdFilter
可以过滤基因id。
IntegerFilter
:需要一个整数
作为输入,并支持条件= =
,! =
,>
,<
,> =
而且< =
.一个例子是GeneStartFilter
它会过滤基因(染色体)起始坐标上的结果。
DoubleFilter
:需要一个数字
作为输入,并支持条件= =
,! =
,>
,<
,> =
而且< =
.
GRangesFilter
:是一个特殊的过滤器,因为它需要农庄
作为价值
并对列的组合(即开始和结束坐标以及序列名和链)执行过滤。保持一致findOverlaps
方法中的IRanges类的构造函数GRangesFilter
Filter需要一个类型
参数来定义其条件。支持的值为“任何”
属性重叠的所有条目(默认值)农庄
,“开始”
而且“结束”
将所有特征分别与相同的起始坐标和结束坐标匹配,“在”
匹配所有的特征在定义的范围农庄
而且“平等”
返回的特征等于农庄
.
筛选器类的名称很直观,第一部分对应于数据库列名,每个字符都在a后面_
大写,后面跟着关键词过滤器
.数据库表列的筛选器的名称gene_id
因此被称为GeneIdFilter
.筛选器的默认数据库列存储在场
槽(访问通过的场
方法)。
的supportedFilters
方法可用于获取中定义的所有可用筛选器对象的概述AnnotationFilter
.
库(AnnotationFilter) supportedFilters ()
# #过滤器领域# # 16 CdsEndFilter cds_end # # 15 CdsStartFilter cds_start # # 6 EntrezFilter entrez # # 19 ExonEndFilter exon_end # # 1 ExonIdFilter exon_id # # 2 ExonNameFilter exon_name # # 18 ExonRankFilter exon_rank # # 17 ExonStartFilter exon_start 24 GRangesFilter农庄# # # # 5 GeneBiotypeFilter gene_biotype # # 21 GeneEndFilter gene_end # # 3 GeneIdFilter gene_id # # 4 GeneNameFilter gene_name # # 20 GeneStartFilter gene_start # # 11 ProteinIdFilter protein_id # # 13 SeqNameFilter seq_name # # 14SeqStrandFilter seq_strand ## 7 SymbolFilter symbol ## 10 TxBiotypeFilter tx_biotype ## 23 TxEndFilter tx_end ## 8 TxIdFilter tx_id ## 9 TxNameFilter tx_name ## 22 TxStartFilter tx_start ## 12 UniprotFilter uniprot
请注意AnnotationFilter
包只提供筛选器类,但不提供应用筛选的功能。这种功能依赖于注释资源和数据库布局,因此需要在提供对注释资源访问的包中实现。
创建过滤器通过它们的专用构造函数,例如GeneIdFilter
函数GeneIdFilter
类。因为这种简单和廉价的创建,过滤器类被认为是只读因此不提供setter方法来更改它们的槽值。除了构造函数之外,AnnotationFilter
提供以下功能翻译将表达式查询到过滤器类中(参见下面的示例)。
下面我们创建一个SymbolFilter
它可用于筛选注释资源,以检索与指定符号值关联的所有条目。
library(AnnotationFilter) smbl <- SymbolFilter("BCL2"
##类:SymbolFilter ##条件:== ##值:BCL2
这样的筛选器应该用于检索与数据库表中名为象征匹配过滤器的值“BCL2”
.
使用“startsWith”
条件是,我们可以定义一个过滤器来检索所有以指定值开头的基因名称/符号的基因条目。“BCL2”
而且“BCL2L11”
对于下面的例子。
smbl <- SymbolFilter("BCL2", condition = " startwith "
##类:SymbolFilter ##条件:startwith ##值:BCL2
除了构造函数之外,AnnotationFilter
提供以更自然和直观的方式创建过滤器实例的功能翻译过滤器表达式(写为公式,即以a开头~
).
smbl <- AnnotationFilter(~ symbol == "BCL2"
##类:SymbolFilter ##条件:== ##值:BCL2
个人AnnotationFilter
对象可以组合在一起AnnotationFilterList
.这个类继承了列表
并提供了额外的logicOp ()
这定义了它的各个过滤器应该如何组合。的长度logicOp ()
必须比筛选对象的数量小1。中的每个元素logicOp ()
定义如何组合两个连续的过滤器。下面我们创建一个AnnotationFilterList
包含要与逻辑组合的两个筛选器对象和.
flt <- AnnotationFilter(~ symbol == "BCL2" & tx_biotype == "protein_coding"
长度为2的注释filterlist ## symbol == 'BCL2' & tx_biotype == 'protein_coding'
请注意AnnotationFilter
函数(还)不支持对嵌套表达式的翻译,例如(symbol == "BCL2L11" & tx_biotype == "nonsense_mediated_decay") | (symbol == "BCL2" & tx_biotype == "蛋白编码")
.然而,这样的查询可以通过嵌套来构建AnnotationFilterList
类。
为第一对过滤器定义过滤器查询。afl1 <- AnnotationFilterList(SymbolFilter("BCL2L11"), TxBiotypeFilter("nonsense_mediated_decay"))afl <- AnnotationFilterList(SymbolFilter("BCL2"), TxBiotypeFilter("protein_coding")) ##现在将两者与逻辑OR相结合afl <- AnnotationFilterList(afl1, afl2, logicOp = "|") afl
##长度为2的注释filterlist ## (symbol == 'BCL2L11' & tx_biotype == 'nonsense_mediated_decay') | (symbol == 'BCL2' & tx_biotype == 'protein_coding')
这AnnotationFilterList
现在会为基因的所有转录本选择所有条目吗BCL2L11与生物型nonsense_mediated_decay或者是该基因的所有蛋白质编码转录本BCL2.
AnnotationFilter
在其他包的AnnotationFilter
包只提供筛选类,但没有筛选功能。这必须在包中使用过滤器来实现。在本节中,我们首先通过一个非常简单的示例展示如何实现AnnotationFilter
类可用于筛选data.frame
然后探讨如何为基于SQL的注释资源实现一个简单的过滤器框架。
让我们首先定义一个简单的data.frame
包含要筛选的数据。注意,这是子集data.frame
使用AnnotationFilter
显然不是最好的解决方案,但它应该有助于理解基本概念。
##定义一个简单的基因表基因<- data.frame(gene_id = 1:10, symbol = c(字母[1:9],"b"), seq_name = paste0("chr", c(1,4,4,8,1,2,5,3, "X", 4)), stringsAsFactors = FALSE)基因
## gene_id symbol seq_name ## 1 1 a chr1 ## 2 2 b chr4 ## 3 3 c chr4 ## 4 4 d chr8 ## 5 5 e chr1 ## 6 6 f chr2 ## 7 7 g chr5 ## 8 8 h chr3 ## 9 9 i chrX ## 10 10 b chr4
接下来我们生成一个SymbolFilter
检查我们能从中提取到什么信息。
smbl <- SymbolFilter("b")
我们可以访问过滤器条件使用条件
方法
条件(smbl)
## [1] "=="
属性的筛选器的值价值
方法
值(smbl)
## [1] "b"
最后场(即数据表中的列)使用场
方法。
字段(smbl)
# #[1]“象征”
有了这些信息,我们可以定义一个简单的函数,该函数接受数据表和过滤器作为输入,并返回一个逻辑
当长度等于表的行数时,真正的
用于匹配筛选器的行。
doMatch <- function(x, filter) {do.call(condition(filter), list(x[, field(filter)], value(filter)))} ##应用这个函数doMatch(gene, smbl)
##[1]假真假假假假假假假假假真
注意,这个简单的函数不支持多个过滤器,也不支持条件“startsWith”
或“endsWith”
.接下来,我们定义第二个函数,它从数据资源中提取相关数据。
doExtract <- function(x, filter) {x[doMatch(x, filter),]} ##应用于数据doExtract(gene, smbl)
## gene_id symbol seq_name ## 2 2 b chr4 ## 10 10 b chr4
我们甚至可以修改doMatch
函数启用筛选器表达式。
doMatch <- function(x, filter) {if (is(filter, "formula")) filter <- AnnotationFilter(filter) do.call(condition(filter), list(x[, field(filter)], value(filter)))} doExtract(gene, ~ gene_id == '2')
## gene_id symbol seq_name ## 2 2 b chr4 . #
对于这样简单的例子AnnotationFilter
可能有点过头了,因为使用标准的R操作也可以达到同样的效果(简单得多)。一个真实的情况AnnotationFilter
基于sql的注释资源变得非常有用。因此,我们接下来将探讨如何使用SQL过滤资源AnnotationFilter
.
我们使用SQLite数据库org.Hs.eg.db为所有人类基因提供各种注释的包。使用包到数据库的连接,我们首先检查哪些数据库表可用,然后为我们的简单过滤示例选择一个表。
我们使用一个EnsDb
使用的SQLite数据库ensembldb打包并实现简单的筛选函数,从其中一个数据库表中提取特定的数据。我们这样加载下面EnsDb.Hsapiens.v75
提供访问人类基因,转录本,外显子和蛋白质注释的包。使用它与数据库的连接,我们首先检查哪些数据库表可用,然后检查哪些数据库表可用字段(即列)的基因表。
##加载所需的包库(org.Hs.eg.db)库(RSQLite) ##获取数据库连接dbcon <- org.Hs.eg_dbconn() ##我们有什么表?dbListTables (dbcon)
##[1]“accessions”“alias”“chrlocations”##[4]“chromosome_locations”“chromobl_locations”“chromobl2ncbi”##[7]“ec”“ensembl”“ensembl2ncbi”##[10]“ensembl_prot”“ensembl_trans”“gene_info”##[13]“genes”“gene_info”##[13]“go_all”“go_bp”“go_bp_all”“go_bp_all”##[19]“go_mf_all”“go_cc_all”“go_mf”##[25]“map_metadata”“metadata”“ncbi2synbl”##[28]“omim”“pfam”“sqlite_stat1”##[34]“sqlite_stat4”“ucsc”##[7]“ec”“ensembl”“ensembl2ncbi”##[7]“ec”“synbl”“synbl_trans”“gene_info”##[13]“基因”“gene_info”##[13]“基因”“gene_info”##[13]“go_b_all”“go_b_bp”“go_bp_all”## b[19]“go_mf_all”“kegg”“map_counts”##[25]“map_metadata”“metadata”“ncbi2synbl”##[34]“sqlite_stat4”“uniprot”
org.Hs.eg.db
提供许多不同的表,每个表用于标识符或注释资源。我们将使用gene_info列出并确定字段(即列)所提供的。
gene_info表中有哪些字段?dbListFields (dbcon“gene_info”)
## [1] "_id" "gene_name" "symbol"
的gene_info表提供了官方基因符号和基因名称。列象征默认匹配场
的价值SymbolFilter
列也一样gene_name为GeneNameFilter.类的字段与数据库中的列不匹配AnnotationFilter
,我们必须实现一个函数,将过滤器对象的默认字段映射到数据库列。参见本节末尾的示例。
我们接下来实现一个简单的doExtractGene
对象检索数据的函数gene_info表,并重用doFilter
函数提取特定数据。的参数x
现在是数据库连接对象。
doExtractGene <- function(x, filter) {gene <- dbGetQuery(x, "select * from gene_info") doExtract(gene, filter)} ##提取BCL2的所有条目BCL2 <- doExtractGene(dbcon, SymbolFilter("BCL2")) BCL2
## 486 486 BCL2凋亡调控因子BCL2
这是可行的,但并不是真正有效的,因为函数首先获取完整的数据库表,然后才对其进行子集设置。一个更有效的解决方法是翻译的AnnotationFilter
类转换为SQL语句在哪里条件,并在数据库级别上执行筛选。这里我们必须做一些小的修改,因为不是所有的条件值都可以在SQL调用中1:1使用。的条件“= =”
例如有被转换成“=”
和“startsWith”
到一个SQL“喜欢”
通过添加“%”
通配符为过滤器的值。我们还需要处理过滤器价值
长度为> 1。一个SymbolFilter
与一个价值
被c(“BCL2”、“BCL2L11”)
需要转换为SQL调用吗“符号(“BCL2”、“BCL2L11”)”
.这里我们跳过这些特殊情况,定义一个转换an的简单函数AnnotationFilter
到一个在哪里条件要包含到SQL调用中。这取决于过滤器是否扩展CharacterFilter
或IntegerFilter
值也必须加引号。
##定义一个函数,将一个过滤器转换为SQL where条件。##字符值必须加引号。where <- function(x) {if (is(x, "CharacterFilter")) value <- paste0("'", value(x), "'") else value <- value(x) paste0(field(x), conditionForSQL(condition(x)), value)} ##现在使用这个函数“翻译”一个过滤器where(SeqNameFilter("Y"))
## [1] "seq_name='Y'"
接下来我们实现一个新函数,该函数将过滤器集成到SQL调用中,以让数据库服务器负责过滤。
##定义函数doExtractGene2 <- function(x, filter) {if (is(filter, "formula")) filter <- AnnotationFilter(filter) query <- paste0("select * from gene_info where ", where(filter)) dbGetQuery(x, query)} bcl2 <- doExtractGene2(dbcon, ~ symbol == " bcl2 ") bcl2
BCL2细胞凋亡调控因子BCL2
下面我们比较两种方法的性能。
系统。time(doExtractGene(dbcon, ~ symbol == "BCL2"))
##用户系统运行## 0.110 0.000 0.111
系统。time(doExtractGene2(dbcon, ~ symbol == "BCL2"))
##用户系统运行## 0.012 0.000 0.012
毫不奇怪,第二种方法要快得多。
请注意,这里显示的示例仅用于演示目的。在现实世界的情况下,还必须考虑其他因素,如过滤器的组合、要连接的数据库表、要返回的列等。
如果要筛选的数据库列不匹配场
一个AnnotatioFilter
?例如,如果数据库列被命名hgnc_symbol而不是象征例如,我们可以在包内部覆盖默认值场
方法SymbolFilter
为数据库列返回正确的字段。
## AnnotationFilter的默认方法:field(SymbolFilter("a"))
# #[1]“象征”
覆盖默认方法。setMethod("field", "SymbolFilter", function(object,…)调用字段返回正确的数据库列字段(SymbolFilter("a"))
## [1] "hgnc_symbol"
sessionInfo ()
## R版本4.2.0 RC (22-04-19 r82224) ##平台:x86_64-pc-linux-gnu(64位)##运行在:Ubuntu 20.04.4 LTS ## ##矩阵产品:default ## BLAS: /home/biocbuild/bbs-3.15-bio /R/lib/libRblas. ##因此## LAPACK: /home/biocbuild/bbs-3.15-bio /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_TELEPHONE= c# [11] LC_MEASUREMENT=en_US。UTF-8 LC_IDENTIFICATION=C ## ##附加的基包:## [1]stats4 stats graphics grDevices utils datasets methods ## [8] base ## ##其他附加的包:## [1]RSQLite_2.2.12 org. chs .eg.db_3.15.0 AnnotationDbi_1.58.0 ## [4] IRanges_2.30.0 S4Vectors_0.34.0 Biobase_2.56.0 ## [7] BiocGenerics_0.42.0 AnnotationFilter_1.20.0 BiocStyle_2.24.0 ## ##通过命名空间加载(并没有附加):# [4] BiocManager_1.30.17 jquerylib_0.1.4 GenomeInfoDb_1.32.0 ## [7] XVector_0.36.0 bitops_1.0-7 tools_4.2.0 ## [10] zlibbioc_1.42.0 bit_4.0.4 digest_0.6.29 ## [13] memoise_2.0.1 jsonlite_1.8.0 evaluate_0.15 ## [16] pkgconfig_2.0.3 png_0.1-7 rlang_1.0.2 ## [19] cli_3.3.0 DBI_1.1.2 yaml_2.3.5 ## [22] xfun_0.30 fastmap_1.1.0 GenomeInfoDbData_1.2.8 ## [25] httr_1.4.2 string_1 .4.0 knitr_1.38 ## [28] Biostrings_2.64.0 vctrs_0.4.1 sass_0.4.1 ## [31]bit64_4.0.5 R6_2.5.1 rmarkdown_2.14 ## [34] bookdown_0.26 blob_1.2.3 magrittr_2.0.3 ## [37] htmltools_0.5.2 genomics icranges_1 .48.0 KEGGREST_1.36.0 ## [40] stringi_1.7.6 RCurl_1.98-1.6 lazyeval_0.2.2 ## [43] cachem_1.0.6 crayon_1.5.1