1.为何使用R
与起源于贝尔实验室的S语言类似,R也是一种为统计计算和绘图而生的语言和环境,它是一套开源的数据分析解决方案,由一个庞大且活跃的全球性研究型社区维护。但是,市面上也有许多其他流行的统计和制图软件,如Microsoft Excel、SAS、IBM SPSS、Stata以及Minitab。为何偏偏要选择R?
R有着非常多值得推荐的特性。
多数商业统计软件价格不菲,投入成千上万美元都是可能的。而R是免费的!如果你是一位教师或一名学生,好处显而易见。
R是一个全面的统计研究平台,提供了各式各样的数据分析技术。几乎任何类型的数据分析工作皆可在R中完成。
R囊括了在其他软件中尚不可用的、先进的统计计算例程。事实上,新方法的更新速度是以周来计算的。如果你是一位SAS用户,想象一下每隔几天就获得一个新SAS过程的情景。
R拥有顶尖水准的制图功能。如果希望复杂数据可视化,那么R拥有最全面且最强大的一系列可用功能。
R是一个可进行交互式数据分析和探索的强大平台,其核心设计理念就是支持图1-1中所概述的分析方法。举例来说,任意一个分析步骤的结果均可被轻松保存、操作,并作为进一步分析的输入。
从多个数据源获取并将数据转化为可用的形式,可能是一个富有挑战性的议题。R可以轻松地从各种类型的数据源导入数据,包括文本文件、数据库管理系统、统计软件,乃至专门的数据仓库。它同样可以将数据输出并写入到这些系统中。R也可以直接从网页、社交媒体网站和各种类型的在线数据服务中获取数据。
R是一个无与伦比的平台,在其上可使用一种简单而直接的方式编写新的统计方法它易于扩展,并为快速编程实现新方法提供了一套十分自然的语言。
R的功能可以被整合进其他语言编写的应用程序,包括C++、Java、Python、PHP、Pentaho、SAS和SPSS。这让你在继续使用自己熟悉语言的同时在应用程序中加入R的功能。
R可运行于多种平台之上,包括Windows、UNIX和Mac OS X。这基本上意味着它可以运行于你所能拥有的任何计算机上。(本人曾在偶然间看到过在iPhone上安装R的教程,让人佩服,但这也许不是一个好主意。)
如果你不想学习一门新的语言,有各式各样的GUI(Graphical User Interface,图形用户界面)工具通过菜单和对话框提供了与R语言同等的功能。
图1-2是展示R制图功能的一个示例。使用一行代码做出的这张图,说明了蓝领工作、白领工作和专业工作在收入、受教育程度以及职业声望方面的关系。从专业角度讲,这是一幅使用不同的颜色和符号表示不同分组的散点图矩阵,带有两类拟合曲线(线性回归和局部加权回归)、置信椭圆以及两种对密度的展示(核密度估计和轴须图)。另外,在每个散点图中都自动标出了值最大的离群点。如果这些术语对你来说很陌生也不必担心。我们将在后续各章中陆续谈及它们。这里请暂且相信我,它们真的非常酷。(搞统计的人读到这里时估计已经垂涎三尺了。)
图1-2主要表明了以下几点。
受教育程度(education)、收入(income)、职业声望(prestige)呈线性相关。
就总体而言,蓝领工作者有着更低的受教育程度、收入和职业声望;反之,专业工作者有着更高的受教育程度、收入和职业声望。白领工作者介于两者之间。
有趣的例外是,铁路工程师(RR.engineer)的受教育程度较低,但收入较高,而牧师(minister)的职业声望高,收入却较低。
第8章将会进一步讨论这类图形。重要的是,R能够让你以一种简单而直接的方式创建优雅、信息丰富、高度定制化的图形。使用其他统计语言创建类似的图形不仅费时费力,而且可能根本无法做到。
可惜的是,R的学习曲线较为陡峭。因为它的功能非常丰富,所以文档和帮助文件也相当多。另外,由于许多功能都是由独立贡献者编写的可选模块提供的,这些文档可能比较零散而且很难找到。事实上,要掌握R的所有功能,可以说是一项挑战。
本书的目标是让读者快速而轻松地学会使用R。我们将遍览R的许多功能,介绍到的内容足以让你开始着手分析数据,并且在需要你深入了解的地方给出参考材料。下面我们从R的安装开
始学习。
2. R的获取与安装
R可以在CRAN(Comprehensive R Archive Network,http://cran.r-project.org)上免费下载。Linux、Mac OS X和Windows都有相应编译好的二进制版本。根据你所选择平台的安装说明进行安装即可。稍后我们将讨论如何通过安装称为包(package)的可选模块(同样可从CRAN下载)来增强R的功能。附录G描述了如何对R进行版本升级。
3. R的使用
R是一种区分大小写的解释型语言。你可以在命令提示符(>)后每次输入并执行一条命令,或者一次性执行写在脚本文件中的一组命令。R中有多种数据类型,包括向量、矩阵、数据框(与数据集类似)以及列表(各种对象的集合)。我们将在第2章中讨论这些数据类型。
R中的多数功能是由程序内置函数、用户自编函数和对对象的创建和操作所提供的。一个对象可以是任何能被赋值的东西。对于R来说,对象可以是任何东西(数据、函数、图形、分析结果,等等)。每一个对象都有一个类属性,类属性可以告诉R怎么对之进行处理。
一次交互式会话期间的所有数据对象都被保存在内存中。一些基本函数是默认直接可用的,而其他高级函数则包含于按需加载的程序包中。
R语句由函数和赋值构成。R使用<-,而不是传统的=作为赋值符号。例如,以下语句:
x <- rnorm(5)
创建了一个名为x的向量对象,它包含5个来自标准正态分布的随机偏差。
3.1 获取帮助
R提供了大量的帮助功能,学会如何使用这些帮助文档可以在相当程度上助力你的编程工作。R的内置帮助系统提供了当前已安装包中所有函数①的细节、参考文献以及使用示例。你可以通过表1-2中列出的函数查看帮助文档。
函数help.start()会打开一个浏览器窗口,我们可在其中查看入门和高级的帮助手册、常见问题集,以及参考材料。函数RSiteSearch()可在在线帮助手册和R-Help邮件列表的讨论存档中搜索指定主题,并在浏览器中返回结果。由函数vignette()函数返回的vignette文档一般是PDF格式的实用介绍性文章。不过,并非所有的包都提供了vignette文档。不难发现,R提供了大量的帮助功能,学会如何使用这些帮助文档,毫无疑问有助于编程。我经常使用?来查看某些函数的功能(如选项或返回值)
3.2 工作空间
工作空间(workspace)就是当前R的工作环境,它存储着所有用户定义的对象(向量、矩阵、函数、数据框、列表)。在一个R会话结束时,你可以将当前工作空间保存到一个镜像中,并在下次启动R时自动载入它。各种命令可在R命令行中交互式地输入。使用上下方向键查看已输入命令的历史记录。这样我们就可以选择一个之前输入过的命令并适当修改,最后按回车重新执行它。
当前的工作目录(working directory)是R用来读取文件和保存结果的默认目录。我们可以使用函数getwd()来查看当前的工作目录,或使用函数setwd()设定当前的工作目录。如果需要读入一个不在当前工作目录下的文件,则需在调用语句中写明完整的路径。记得使用引号闭合这些目录名和文件名。用于管理工作空间的部分标准命令见表1-3。
代码清单1-2 用于管理R工作空间的命令使用示例
setwd("C:/myprojects/project1")
options()
options(digits=3)
x <- runif(20)
summary(x)
hist(x)
q()
首先,当前工作目录被设置为C:/myprojects/project1,当前的选项设置情况将显示出来,而数字将被格式化,显示为具有小数点后三位有效数字的格式。然后,我们创建了一个包含20个均匀分布随机变量的向量,生成了此数据的摘要统计量和直方图。当q()函数被运行的时候,程序将向用户询问是否保存工作空间。如果用户输入y,命令的历史记录保存到文件.Rhistory中,工作空间(包含向量x)保存到当前目录中的文件.RData中,会话结束,R程序退出。
注意setwd()命令的路径中使用了正斜杠。R将反斜杠(\)作为一个转义符。即使你在
Windows平台上运行R,在路径中也要使用正斜杠。同时注意,函数setwd()不会自动创建一个不存在的目录。如果必要的话,可以使用函数dir.create()来创建新目录,然后使用setwd()将工作目录指向这个新目录。
在独立的目录中保存项目是一个好主意。你也许会在启动一个R会话时使用setwd()命令指定到某一个项目的路径,后接不加选项的load(“.RData”)命令。这样做可以让你从上一次会话结束的地方重新开始,并保证各个项目之间的数据和设置互不干扰。在Windows和Mac OS X平台上就更简单了。跳转到项目所在目录并双击之前保存的镜像文件即可。这样做可以启动R,载入保存的工作空间,并设置当前工作目录到这个文件夹中。
3.3 输入和输出
启动R后将默认开始一个交互式的会话,从键盘接受输入并从屏幕进行输出。不过你也可以处理写在一个脚本文件(一个包含了R语句的文件)中的命令集并直接将结果输出到多类目标中。
3.3.1 输入
函数source(“filename”)可在当前会话中执行一个脚本。如果文件名中不包含路径,R将
假设此脚本在当前工作目录中。举例来说,source(“myscript.R”)将执行包含在文件
myscript.R中的R语句集合。依照惯例,脚本文件以.R作为扩展名,不过这并不是必需的。
3.3.2 文本输出
函数sink(“filename”)将输出重定向到文件filename中。默认情况下,如果文件已经存在,则它的内容将被覆盖。使用参数append=TRUE可以将文本追加到文件后,而不是覆盖它。参数split=TRUE可将输出同时发送到屏幕和输出文件中。不加参数调用命令sink()将仅向屏幕返回输出结果
3.3.3 图形输出
虽然sink()可以重定向文本输出,但它对图形输出没有影响。要重定向图形输出,使用表1-4中列出的函数即可。最后使用dev.off()将输出返回到终端。
4.R语言包
R提供了大量开箱即用的功能,但它最激动人心的一部分功能是通过可选模块的下载和安装来实现的。目前有5500多个称为包(package)的用户贡献模块可从http://cran.r-project.org/ web/packages下载。这些包提供了横跨各种领域、数量惊人的新功能,包括分析地理数据、处理蛋白质质谱,甚至是心理测验分析的功能。本书中多次使用了这些可选包
4.1 包的安装
有许多R函数可以用来管理包。第一次安装一个包,使用命令install.packages()即可。
举例来说,不加参数执行命令install.packages()将显示一个CRAN镜像站点的列表,选择其中一个镜像站点之后,将看到所有可用包的列表,选择其中的一个包即可进行下载和安装。如果知道自己想安装的包的名称,可以直接将包名作为参数提供给这个函数。例如,包gclus中提供了创建增强型散点图的函数。可以使用命**install.packages(“gclus”)**来下载和安装它。
一个包仅需安装一次。但和其他软件类似,包经常被其作者更新。使用命update.packages()可以更新已经安装的包。要查看已安装包的描述,可以使用installed.
packages()命令,这将列出安装的包,以及它们的版本号、依赖关系等信息。
4.2 包的载入
包的安装是指从某个CRAN镜像站点下载它并将其放入库中的过程。要在R会话中使用它,还需要使用library()命令载入这个包。例如,要使用gclus包,执行命令library(gclus)
即可。当然,在载入一个包之前必须已经安装了这个包。在一个会话中,包只需载入一次。如果需要,你可以自定义启动环境以自动载入会频繁使用的那些包。启动环境的自定义在附录B中有详细描述。