AnnDbBimap对象是R里面的bioconductor系列包的基础对象,在探针数据里面会包装成ProbeAnnDbMap,跟go通路相关又是GOTermsAnnDbBimap对象。
但是它都是AnnDbBimap对象衍生过来的
主要存在于芯片系列的包和org系列的包,其实AnnDbBimap对象就是list对象的包装,比如下面这些例子:
ls("package:hgu133plus2.db")
[1] "hgu133plus2" "hgu133plus2.db" "hgu133plus2_dbconn" |
[4] "hgu133plus2_dbfile" "hgu133plus2_dbInfo" "hgu133plus2_dbschema" |
[7] "hgu133plus2ACCNUM" "hgu133plus2ALIAS2PROBE" "hgu133plus2CHR" |
[10] "hgu133plus2CHRLENGTHS" "hgu133plus2CHRLOC" "hgu133plus2CHRLOCEND" |
[13] "hgu133plus2ENSEMBL" "hgu133plus2ENSEMBL2PROBE" "hgu133plus2ENTREZID" |
[16] "hgu133plus2ENZYME" "hgu133plus2ENZYME2PROBE" "hgu133plus2GENENAME" |
[19] "hgu133plus2GO" "hgu133plus2GO2ALLPROBES" "hgu133plus2GO2PROBE" |
[22] "hgu133plus2MAP" "hgu133plus2MAPCOUNTS" "hgu133plus2OMIM" |
[25] "hgu133plus2ORGANISM" "hgu133plus2ORGPKG" "hgu133plus2PATH" |
[28] "hgu133plus2PATH2PROBE" "hgu133plus2PFAM" "hgu133plus2PMID" |
[31] "hgu133plus2PMID2PROBE" "hgu133plus2PROSITE" "hgu133plus2REFSEQ" |
[34] "hgu133plus2SYMBOL" "hgu133plus2UNIGENE" "hgu133plus2UNIPROT" |
那么我们可以随便挑选包中的一个数据分析一下
x <- hgu133plus2SYMBOL
xlist=as.list(x)
我们查看X对象,可知,它是object of class "ProbeAnnDbMap",而这个对象,就是常见的list对象,被包装了一下, 只有我们明白了它和list对象到底有什么区别,才算是真正搞懂了这一系列包
但是这个ProbeAnnDbMap对象,在GO等包里面会被包装成更复杂的对象-GOTermsAnnDbBimap,但是对他们的理解都大同小异。
我们先回顾一下在R语言里面的list的基础知识:
R 的 列表(list)是一个以对象的有序集合构成的对象。 列表中包含的对象又称为它的分量(components)。
分量可以是不同的模式或者类型, 如一个列表可以包括数值向量,逻辑向量,矩阵,复向量, 字符数组,函数等等
如果你会perl的话,可以把它理解成hash。
分量常常会被编号的(numbered),并且可以利用它来 访问分量
列表的分量可以被命名,这种情况下 可以通过名字访问。
特别要注意一下 Lst[[1]] 和 Lst[1] 的差别。 [[...]] 是用来选择单个 元素的操作符,而 [...] 是一个更为一般 的下标操作符。
因此前者得到的是列表 Lst 中的第一个对象, 并且含有分量名字的命名列表(named list)中分量的名字会被排除在外的。
后者得到的则是列表 Lst 中仅仅由第一个元素 构成的子列表。如果是命名列表, 分量名字会传给子列表的。
那么接下来我们就看看x和xlist的区别。
它们里面的数据都是affymetrix公司出品的人类的hgu133plus2芯片的探针ID与基因symbol的对应关系
如果我想拿到所有的探针ID,那么对于AnnDbBimap对象,需要用mappedkeys(x),对于普通的list对象,需要用names(xlist).
对于普通的list对象,如果我想看前几个元素,直接head就可以了,但是对于AnnDbBimap对象,数据被封装好了,需要先as.list,然后才能head
mapped_probes <- mappedkeys(x)
PID2=head(mapped_probes)
那么,如果我们想根据以下探针ID来查看它们在这些数据里面被对应着哪些基因symbol 呢?
> PID2 #这是一串探针ID,后面的操作都需要用的
[1] "1053_at" "117_at" "121_at" "1255_g_at" "1316_at" "1320_at"
如果是对于AnnDbBimap对象,我们可以用mget函数来操作,取多个探针的对应基因symbol
accnum <- mget(PID2, env=hgu133plus2ACCNUM);
gname <- mget(PID2, env=hgu133plus2GENENAME)
gsymbol <- mget(PID2, env=hgu133plus2SYMBOL)
mget函数返回的就是普通的list函数了,可以直接查看了。
如果是对于普通的list对象,我们想取多个探针的对应基因symbol也是非常简单的,xlist[PID2]即可。
那么我们不禁有问了,既然它们两个功能完全一样,何苦把它包装成一个对象了,我直接操作list对象不就好了,学那么多规矩干嘛?
所以,重点就来了
> length(mapped_probes)
[1] 42125
> length(names(xlist))
[1] 54675
看懂了吗?
但是,事实上用处也不大,你觉得下面这两个有区别吗?
SYMBOL <- AnnotationDbi::as.list(hgu133plus2SYMBOL)
SYMBOL <- SYMBOL[!is.na(SYMBOL)];
x <- hgu133plus2SYMBOL
mapped_probes <- mappedkeys(x)
SYMBOL <- AnnotationDbi::as.list(x[mapped_probes])
PS,在R里面创建一个list对象是非常简单的
The setNames()
built-in function makes it easy to create a hash from given key and value lists.(Thanks to Nick K for the better suggestion.)
Usage: hh <- setNames(as.list(values), keys)
Example:
players <- c("bob", "tom", "tim", "tony", "tiny", "hubert", "herbert")
rankings <- c(0.2027, 0.2187, 0.0378, 0.3334, 0.0161, 0.0555, 0.1357)
league <- setNames(as.list(rankings), players)