提要
本章我们将覆盖R的基本使用并开始处理Bioconductor中的数据包和工具。包含的主题有R的简单编程,R绘图并处理哈希表。我们将介绍ExpressionSet类作为用于存储基因组数据的基本Bioconductor数据结构的一个例子.我们还将探索基因表达数据的可视化技术,来感受R 强大的可视化功能。
2.1 在R中寻找帮助
知道怎么寻找帮助是开始R和Bioconductor的重要一步,包括大量的函数、类和你将要遇到的概念。操作符号?是给你R对象信息的最直接的来源。在名字前面加一个?让你快速进入该函数的帮助文档。?有一个对于类的特殊功能。class ? foo会进入foo类的帮助文档页面,那里你可以查到这个类的可用方法的信息。
函数apropos可以用来寻找部分匹配给定的字符串的对象路径,find也可以定位对象,但是匹配更加严格。
apropos("mean")
[1] "colMeans" "kmeans"
[3] "mean" "mean.Date"
[5] "mean.POSIXct" "mean.POSIXlt"
[7] "mean.data.frame" "mean.default"
[9] "mean.difftime" "rowMeans"
[11] "weighted.mean
find("mean")
[1] "package:base"
如果你想要获取某一个主题或者概念的信息,试试help.search。该函数搜索能够匹配给定字符串的帮助系统的文档,包括里面的文件名、别名、题目、概念或者关键词。名称或者标题匹配的帮助条目将会展示出来。
help.search("mean")
更多更丰富的信息在网站上:一个非常好的介绍是R-Foundation(2007)。对于许多R相关的问题,你很有可能在R-FAQ中找到答案。更多特殊的帮助资源在R和Bioconductor的邮件列表中。你可以根据子集的兴趣和专业水平在不同的子列表中向R社区提交问题。在此之前,你需要阅读发帖指南。通常邮件列表中的问题因为触犯主要的发帖规则将不会被回答。较好的做法是在提交问题之前先搜索网上的邮件框架。有很多问题已有其他人进行了提问和回答。Bioconductor还有一个可以搜索的文档,R的文档这些网页在Bioconductor和R-Project Web的网页上也可以找到。
大部分的Bioconductor包的vignetts含有有价值信息资源。Vignetts用来描述为完成一个或一组任务所需要的全部步骤,这个任务就是该包设计的目的。文本和可执行代码在一个文档中被放在一起,有点类似于正在阅读的这篇文章,这让你能更方便的在自己的电脑中产生个性化的步骤或者为你的任务进行特殊修饰。在Biobase中的openVignette函数可以用来打开vignetts的PDF版本。Vignetts在你加载一个包之后即可获取(下一部分将要介绍包的概念)。
Exercise 2.1
- a. 有多种不同的画图函数,你可以找到它们吗?
- b. 试着找找哪个函数是用来进行Mann-Whitney检测的。
- c. 打开vignette"Bioconductor Overview",它是Biobase包的一部分。
2.2 使用包
R和Bioconductor的设计是模块化的。大量的功能是通过附加的软件单元——“包”来提供的。R和Biocondunctor都有大量可用的包。在处理数据之前,你应该学习如何去寻找、下载和安装包。
有多种不同的途径,我们希望他们越来越标准化。R包存储在library里面。在你的计算机里面,你可以有多个library,尽管大部分人在他们的个人电脑里面只有一个。为你的library添加包,你需要下载和安装。之后,每次你要使用该包,你只需要加载,你可以使用library函数或者require函数。
可以在R发布版本的GUI(Windows或者Mac OS X)下载中完成下载包,在这些平台中你仅需要从一个列表中选择你希望安装的包,然后它们就会被下载安装。安装一个包之后不会自动加载,你必须自己动手。该机制默认下载合适的二进制包。
你可以用函数install.packages来下载特殊的包。一个关于install.packages函数控制的争论是依赖的包是不是一同下载,在Bioconductor中我们强烈建议设定为TRUE。
为了尽可能方便的安装Bioconductor包,我们提供了一个网络脚本biocLite,你可以用它来安装任何Bioconductor包和依赖包。你也可以用它来安装CRAN上的包。这里展示如何用biocLite来安装graph和xtable包。
source("http://bioconductor.org/biocLite.R")
biocLite(c("graph", "xtable"))
命令update.packages可以检查和安装已安装包的最新版本。注意你需要为update.packages提供一个Bioconductor仓储的URL,以更新Bioconductor包。推荐的更新包的方式如下:
source("http://bioconductor.org/biocLite.R")
update.packages(repos=biocinstallRepos(), ask=FALSE)
练习 2.2
- 函数sessionInfo的输出结果是什么?
2.3 R基础
在开始之前,让我们确保你熟悉R的基本数据结构和基本操作,这些对使用已经存在的软件和写你自己的脚本都很重要。如果你发现下面的五个问题很简单,你已经准备好继续本章内容,并学习处理基因组数据的大部分内容。如果不是,也许你应该返回“R简介”一章,找到[R基地]( http://cran.r-project.org/manuals/
R-intro.html)的主页,获得更多的关于这门语言的本质的更多细节。
练习 2.3
- a.R中最简单是数据结构是向量,你可以创建一下向量吗?
- x包含元素0.1, 1.1, 2.5, 和10
- 一个整型向量y包含元素1到100
- 逻辑型向量z,提示y中小于10的元素
- 向量名字为pets包含元素dog, cat, bird.
- b. 在算术表达式中向量会发生什么?下列表达式的结果是什么?
- 2 * x + c(1, 2)
- c. 索引向量可以用来选择一个向量的子集。三类不同的索引向量分别是什么?我们怎么去访问一个矩阵或者数组?
- d. 我们怎么访问一个列表的元素,怎么创建列表?
- e. 矩阵和数据框有什么区别?
2.3.1 函数
在R中写一个函数非常容易。所有的函数接受输入并且返回值。在R中,一个函数的返回值要么通过调用函数return来明晰的说明,要么是最后一个表达式的计算结果。下列两个函数将会返回同样的结果。
sq1 = function(x) return(x*x)
sq2 = function(x) x*x
这些函数是向量化的。这意味着你可以传递一个向量x,然后函数会对向量中的每一个元素进行平方。注意如果你使用两个不等长的向量,在的向量化操作中,R将会尝试循环较短的那一个。也许这对某一些应用非常有用,但也可能会导致不起期望的结果。
练习 2.4
在这一练习中,我希望你写一个在下一部分会使用的函数。它依赖于R的函数paste,也许你希望阅读该函数的帮助文档。这个函数接受一个字符串作为输入,返回一个字符串,在字符串前加脱字符*。我们叫它做*ppc*。我们期望的是这样**ppc("xx")**返回"xx"。*
其中一个经常使用自定义函数的地方是apply函数系列,在接下来的部分我们会展示一些例子。
2.3.2 apply系函数
在R中,大量的工作是通过应用一些函数来作用于一列数组、矩阵或者列表。有几个函数你可以使用,apply, lapply, sapply是最常使用的。eapply函数可对一个environment里的每一个类传递函数。在下面的章节章我们会展示怎么创建环境并进行工作。
为了理解apply系函数是怎么工作的,我们用它们来探索一些Affymetrix®HG-U95Av2 GeneChip®的元数据。因为这些数据存储在我们将会用到eapply函数的环境中。
hgu95av2MAP环境包含了昂飞探针号(Affymetrix)和染色体区带定位的映射。比如,下面的代码我们将会发现基因探针1001_at (TIE1)对应的染色体区带。
library("hgu95av2")
hgu95av2MAP$"1001_at"
[1] "1p34-p33"
我们可以用apply系函数提取对某一个特定染色体或者其部分的全部映射信息。首先我们明确我们的问题:如我们希望找到17号染色体p臂上所有的映射。然后我们知道这些映射位置的字符串以17p开头。这是一个最简单的正则表达式, ^17P,在这里脱字符, ^意味着我们会从开始处匹配该字符。我们分两步来做:首先用eapply和grep函数来查询grep并返回匹配的值。
myPos = eapply(hgu95av2MAP, function(x) grep("^17p", x,
value=TRUE))
myPos = unlist(myPos)
length(myPos)
[1] 190
在这里我们使用了匿名函数来处理hgu95av2MAP environment中的每一个元素。我们可以先命名它,然后调用它。
f17p = function(x) grep("^17p", x, value=TRUE)
myPos2 = eapply(hgu95av2MAP, f17p)
myPos2 = unlist(myPos2)
identical(myPos, myPos2)
[1] TRUE
练习 2.5
用在前一个练习中创建的函数ppc来创建一个新的函数,使其可以查找和返回任意染色体(在染色体号前加上脱字符^即可)映射的探针,或者染色体号加p或者q。
2.3.3 环境
在R中,环境是一系列符号-值对的集合。这有点类似于列表,但是不对值进行排序,所以你不可以使用数字索引。否则,它们变现出同样的方式。在前面的章节中,你已经使用了用来存储昂飞探针号和染色体区带定位的映射的environment。在这里我们展示怎么处理你的environment。
我们首先创建一个environment然后执行一些简单的任务,比如存储、删除、对内容形成列表。
e1 = new.env(hash=TRUE)
e1$a = rnorm(10)
e1$b = runif(20)
ls(e1)
[1] "a" "b"
xx = as.list(e1)
names(xx)
[1] "a" "b"
rm(a, envir=e1)
练习2.6
- a. 创建一个environment,利用上一个练习中的函数来放入18号染色体所有的基因的染色体位置。
- b. 在环境中创建第二个函数,提取染色体位置的字符串并且对每一条字符串剔除18这个数字。函数gsub能够帮助到你。
- c. 现在创建一个函数myExtract,用environment作为一个参数,返回一个剔除过的染色体区位的列表。(比如,在环境中对染色体区位向量利用stripping函数)