第 1 章 R语言介绍

第 1 章 R语言介绍

本章内容

  • R的安装

  • 熟悉R语言

  • 运行R程序

我们分析数据的方式在近年来发生了令人瞩目的变化。随着个人电脑和互联网的出现,可获取的数据量有了非常可观的增长。商业公司拥有TB级的客户交易数据,政府、学术团体以及私立研究机构同样拥有各类研究课题的大量档案和调查数据。从这些海量数据中收集信息(更不用说发现规律)已经成为了一项产业。同时,如何以容易让人理解和消化的方式呈现这些信息也日益富有挑战性。

数据分析科学(统计学、计量心理学、计量经济学、机器学习)的发展一直与数据的爆炸式增长保持同步。远在个人电脑和互联网发端之前,学术研究人员就已经开发出了很多新的统计方法,并将其研究成果以论文的形式发表在专业期刊上。这些方法可能需要很多年才能够被程序员改写并整合到广泛用于数据分析的统计软件中。而如今,新的方法层出不穷。统计研究者经常在人们常访问的网站上发表新方法和改进的方法,并附上相应的实现代码。

个人电脑的出现还对我们分析数据的方式产生了另外一种影响。当数据分析需要在大型机上完成的时候,机时非常宝贵难求。分析师们会小心地设定可能用到的所有参数和选项,再让计算机执行计算。程序运行完毕后,输出的结果可能长达几十甚至几百页。之后,分析师会仔细筛查整个输出,去芜存菁。许多受欢迎的统计软件正是在这个时期开发出来的。直到现在,统计软件依然在一定程度上沿袭了这种处理方式。

随着个人电脑将计算变得廉价且便捷,现代数据分析的方式发生了变化。与过去一次性设置好完整的数据分析过程不同,现在这个过程已经变得高度交互化,每一阶段的输出都可以充当下一阶段的输入。一个典型的数据分析过程的示例见图1-1。在任何时刻,这个循环都可能在进行着数据变换、缺失值插补、变量增加或删除,甚至重新执行整个过程。当分析师认为他们已经深入地理解了数据,并且可以回答所有能够回答的相关问题时,这个过程即告结束。

图 1-1 典型的数据分析步骤

个人电脑的出现(特别是高分辨率显示器的普及)同样对理解和呈现分析结果产生了重大影响。一图胜千言,绝对如此!人类非常擅长通过视觉获取有用信息。现代数据分析也日益依赖通过呈现图形来揭示含义和表达结果。

今天的数据分析人士需要从广泛的数据源(数据库管理系统、文本文件、统计软件以及电子表格)获取数据,将数据片段融合到一起,对数据做清理和标注,用最新的方法进行分析,以有意义有吸引力的图形化方式展示结果,最后将结果整合成令人感兴趣的报告并向利益相关者和公众发布。通过下面的介绍你会看到,R正是一个适合完成以上目标的理想而又功能全面的软件。

1.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 蓝领(bc)、白领(wc)、专业工作者(prof)的收入、受教育程度和职业声望之间的关系。资料来源:John Fox编写的car包(函数scatterplotMatrix())。使用其他统计编程语言很难绘制类似的图形,但在R中只需一到两行代码

图1-2是展示R制图功能的一个示例。使用一行代码做出的这张图,说明了蓝领工作、白领工作和专业工作在收入、受教育程度以及职业声望方面的关系。从专业角度讲,这是一幅使用不同的颜色和符号表示不同分组的散点图矩阵,带有两类拟合曲线(线性回归和局部加权回归)、置信椭圆以及两种对密度的展示(核密度估计和轴须图)。另外,在每个散点图中都自动标出了值最大的离群点。如果这些术语对你来说很陌生也不必担心。我们将在后续各章中陆续谈及它们。这里请暂且相信我,它们真的非常酷。(搞统计的人读到这里时估计已经垂涎三尺了。)

图1-2主要表明了以下几点。

  • 受教育程度(education)、收入(income)、职业声望(prestige)呈线性相关。

  • 就总体而言,蓝领工作者有着更低的受教育程度、收入和职业声望;反之,专业工作者有着更高的受教育程度、收入和职业声望。白领工作者介于两者之间。

  • 有趣的例外是,铁路工程师(RR.engineer)的受教育程度较低,但收入较高,而牧师(minister)的职业声望高,收入却较低。

第8章将会进一步讨论这类图形。重要的是,R能够让你以一种简单而直接的方式创建优雅、信息丰富、高度定制化的图形。使用其他统计语言创建类似的图形不仅费时费力,而且可能根本无法做到。

可惜的是,R的学习曲线较为陡峭。因为它的功能非常丰富,所以文档和帮助文件也相当多。另外,由于许多功能都是由独立贡献者编写的可选模块提供的,这些文档可能比较零散而且很难找到。事实上,要掌握R的所有功能,可以说是一项挑战。

本书的目标是让读者快速而轻松地学会使用R。我们将遍览R的许多功能,介绍到的内容足以让你开始着手分析数据,并且在需要你深入了解的地方给出参考材料。下面我们从R的安装开始学习。

1.2 R的获取和安装

R可以在CRAN(Comprehensive R Archive Network,http://cran.r-project.org)上免费下载。Linux、Mac OS X和Windows都有相应编译好的二进制版本。根据你所选择平台的安装说明进行安装即可。稍后我们将讨论如何通过安装称为(package)的可选模块(同样可从CRAN下载)来增强R的功能。附录G描述了如何对R进行版本升级。

1.3 R的使用

R是一种区分大小写的解释型语言。你可以在命令提示符(>)后每次输入并执行一条命令,或者一次性执行写在脚本文件中的一组命令。R中有多种数据类型,包括向量、矩阵、数据框(与数据集类似)以及列表(各种对象的集合)。我们将在第2章中讨论这些数据类型。

R中的多数功能是由程序内置函数、用户自编函数和对对象的创建和操作所提供的。一个对象可以是任何能被赋值的东西。对于R来说,对象可以是任何东西(数据、函数、图形、分析结果,等等)。每一个对象都有一个类属性,类属性可以告诉R怎么对之进行处理。

一次交互式会话期间的所有数据对象都被保存在内存中。一些基本函数是默认直接可用的,而其他高级函数则包含于按需加载的程序包中。

R语句由函数和赋值构成。R使用<-,而不是传统的=作为赋值符号。例如,以下语句:

x <- rnorm(5)

创建了一个名为x的向量对象,它包含5个来自标准正态分布的随机偏差。

注意 R允许使用=为对象赋值,但是这样写的R程序并不多,因为它不是标准语法。一些情况下,用等号赋值会出现问题,R程序员可能会因此取笑你。你还可以反转赋值方向。例如,rnorm(5) -> x与上面的语句等价。重申一下,使用等号赋值的做法并不常见,在本书中不推荐使用。

注释由符号#开头。在#之后出现的任何文本都会被R解释器忽略。

1.3.1 新手上路

如果你使用的是Windows,从开始菜单中启动R。在Mac上,则需要双击应用程序文件夹中的R图标。对于Linux,在终端窗口中的命令提示符下敲入R并回车。这些方式都可以启动R(R界面参见图1-3)。

{%}

图 1-3 Windows中的R界面

让我们通过一个简单的虚构示例来直观地感受一下这个界面。假设我们正在研究生理发育问题,并收集了10名婴儿在出生后一年内的月龄和体重数据(见表1-1)。我们感兴趣的是体重的分布及体重和月龄的关系。

表 1-1 10名婴儿的月龄和体重

年龄(月)

体重(kg)

01

4.4

03

5.3

05

7.2

02

5.2

11

8.5

09

7.3

03

6.0

09

10.4

12

10.2

03

6.1

注:以上为虚构数据。

代码清单1-1给出了分析的过程。可以使用函数c()以向量的形式输入月龄和体重数据,此函数可将其参数组合成一个向量或列表。然后用mean()sd()cor()函数分别获得体重的均值和标准差,以及月龄和体重的相关度。最后使用plot()函数,从而用图形展示月龄和体重的关系,这样就可以用可视化的方式检查其中可能存在的趋势。函数q()将结束会话并允许你退出R。

代码清单1-1 一个R会话示例

> age <- c(1,3,5,2,11,9,3,9,12,3)
> weight <- c(4.4,5.3,7.2,5.2,8.5,7.3,6.0,10.4,10.2,6.1)
> mean(weight)
[1] 7.06
> sd(weight)
[1] 2.077498
> cor(age,weight)
[1] 0.9075655
> plot(age,weight)
> q()

从代码清单1-1中可以看到,这10名婴儿的平均体重是7.06kg,标准差为2.08kg,月龄和体重之间存在较强的线性关系(相关度=0.91)。这种关系也可以从图1-4所示的散点图中看到。不出意料,随着月龄的增长,婴儿的体重也趋于增加。

散点图1-4的信息量充足,但过于“功利”,也不够美观。接下来的几章里,我们会讲到如何自定义图形以契合需要。

{%}

图 1-4 婴儿体重(千克)和年龄(月)的散点图

小提示 若想大致了解R能够作出何种图形,在命令行中运行demo()即可。生成的部分图形如图1-5所示。其他的演示还有demo(Hershey)demo(persp)demo(image)。要看到完整的演示列表,不加参数直接运行demo()即可。

{%}

图 1-5 函数demo()绘制的图形示例

1.3.2 获取帮助

R提供了大量的帮助功能,学会如何使用这些帮助文档可以在相当程度上助力你的编程工作。R的内置帮助系统提供了当前已安装包中所有函数1的细节、参考文献以及使用示例。你可以通过表1-2中列出的函数查看帮助文档。

1确切地说,这里的“所有”是指那些已导出的(exported)、对用户可见的函数。——译者注

表 1-2 R中的帮助函数

函数

功能

help.start()

打开帮助文档首页

help("foo")?foo

查看函数foo的帮助(引号可以省略)

help.search("foo")??foo

foo为关键词搜索本地帮助文档

example("foo")

函数foo的使用示例(引号可以省略)

RSiteSearch("foo")

foo为关键词搜索在线文档和邮件列表存档

apropos("foo", mode="function")

列出名称中含有foo的所有可用函数

data()

列出当前已加载包中所含的所有可用示例数据集

vignette()

列出当前已安装包中所有可用的vignette文档

vignette("foo")

为主题foo显示指定的vignette文档

函数help.start()会打开一个浏览器窗口,我们可在其中查看入门和高级的帮助手册、常见问题集,以及参考材料。函数RSiteSearch()可在在线帮助手册和R-Help邮件列表的讨论存档中搜索指定主题,并在浏览器中返回结果。由函数vignette()函数返回的vignette文档一般是PDF格式的实用介绍性文章。不过,并非所有的包都提供了vignette文档。不难发现,R提供了大量的帮助功能,学会如何使用这些帮助文档,毫无疑问有助于编程。我经常使用?来查看某些函数的功能(如选项或返回值)。

1.3.3 工作空间

工作空间(workspace)就是当前R的工作环境,它存储着所有用户定义的对象(向量、矩阵、函数、数据框、列表)。在一个R会话结束时,你可以将当前工作空间保存到一个镜像中,并在下次启动R时自动载入它。各种命令可在R命令行中交互式地输入。使用上下方向键查看已输入命令的历史记录。这样我们就可以选择一个之前输入过的命令并适当修改,最后按回车重新执行它。

当前的工作目录(working directory)是R用来读取文件和保存结果的默认目录。我们可以使用函数getwd()来查看当前的工作目录,或使用函数setwd()设定当前的工作目录。如果需要读入一个不在当前工作目录下的文件,则需在调用语句中写明完整的路径。记得使用引号闭合这些目录名和文件名。用于管理工作空间的部分标准命令见表1-3。

表 1-3 用于管理R工作空间的函数

函数

功能

getwd()

显示当前的工作目录

setwd("mydirectory")

修改当前的工作目录为mydirectory

ls()

列出当前工作空间中的对象

rm(objectlist)

移除(删除)一个或多个对象

help(options)

显示可用选项的说明

options()

显示或设置当前选项

history(#)

显示最近使用过的#个命令(默认值为25)

savehistory("myfile")

保存命令历史到文件myfile中(默认值为.Rhistory)

loadhistory("myfile")

载入一个命令历史文件(默认值为.Rhistory)

save.image("myfile")

保存工作空间到文件myfile中(默认值为.RData)

save(objectlist, file="myfile")

保存指定对象到一个文件中

load("myfile")

读取一个工作空间到当前会话中(默认值为.RData)

q()

退出R。将会询问你是否保存工作空间

要了解这些命令是如何运作的,运行代码清单1-2中的代码并查看结果。

代码清单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,载入保存的工作空间,并设置当前工作目录到这个文件夹中。

1.3.4 输入和输出

启动R后将默认开始一个交互式的会话,从键盘接受输入并从屏幕进行输出。不过你也可以处理写在一个脚本文件(一个包含了R语句的文件)中的命令集并直接将结果输出到多类目标中。

1. 输入

函数source("filename")可在当前会话中执行一个脚本。如果文件名中不包含路径,R将假设此脚本在当前工作目录中。举例来说,source("myscript.R")将执行包含在文件myscript.R中的R语句集合。依照惯例,脚本文件以.R作为扩展名,不过这并不是必需的。

2. 文本输出

函数sink("filename")将输出重定向到文件filename中。默认情况下,如果文件已经存在,则它的内容将被覆盖。使用参数append=TRUE可以将文本追加到文件后,而不是覆盖它。参数split=TRUE可将输出同时发送到屏幕和输出文件中。不加参数调用命令sink()将仅向屏幕返回输出结果。

3. 图形输出

虽然sink()可以重定向文本输出,但它对图形输出没有影响。要重定向图形输出,使用表1-4中列出的函数即可。最后使用dev.off()将输出返回到终端。

表 1-4 用于保存图形输出的函数

函数

输出

bmp("filename.bmp")

BMP文件

jpeg("filename.jpg")

JPEG文件

pdf("filename.pdf")

PDF文件

png("filename.png")

PNG文件

postscript("filename.ps")

PostScript文件

svg("filename.svg")

SVG 文件

win.metafile("filename.wmf")

Windows图元文件

让我们通过一个示例来了解整个流程。假设我们有包含R代码的三个脚本文件script1.R、script2.R和script3.R。执行语句:

source("script1.R")

将会在当前会话中执行script1.R中的R代码,结果将出现在屏幕上。

如果执行语句:

sink("myoutput", append=TRUE, split=TRUE)
pdf("mygraphs.pdf")
source("script2.R")

文件script2.R中的R代码将执行,结果也将显示在屏幕上。除此之外,文本输出将被追加到文件myoutput中,图形输出将保存到文件mygraphs.pdf中。

最后,如果我们执行语句:

sink()
dev.off()
source("script3.R")

文件script3.R中的R代码将执行,结果将显示在屏幕上。这一次,没有文本或图形输出保存到文件中。整个流程大致如图1-6所示。

图 1-6 使用函数source()进行输入并使用函数sink()进行输出

R对输入来源和输出走向的处理相当灵活,可控性很强。在1.5节中,我们将学习如何在批处理模式下运行R程序。

1.4 包

R提供了大量开箱即用的功能,但它最激动人心的一部分功能是通过可选模块的下载和安装来实现的。目前有5500多个称为(package)的用户贡献模块可从http://cran.r-project.org/web/packages下载。这些包提供了横跨各种领域、数量惊人的新功能,包括分析地理数据、处理蛋白质质谱,甚至是心理测验分析的功能。本书中多次使用了这些可选包。

1.4.1 什么是包

包是R函数、数据、预编译代码以一种定义完善的格式组成的集合。计算机上存储包的目录称为(library)。函数.libPaths()能够显示库所在的位置, 函数library()则可以显示库中有哪些包。

R自带了一系列默认包(包括basedatasetsutilsgrDevicesgraphicsstats以及methods),它们提供了种类繁多的默认函数和数据集。其他包可通过下载来进行安装。安装好以后,它们必须被载入到会话中才能使用。命令search()可以告诉你哪些包已加载并可使用。

1.4.2 包的安装

有许多R函数可以用来管理包。第一次安装一个包,使用命令install.packages()即可。举例来说,不加参数执行命令install.packages()将显示一个CRAN镜像站点的列表,选择其中一个镜像站点之后,将看到所有可用包的列表,选择其中的一个包即可进行下载和安装。如果知道自己想安装的包的名称,可以直接将包名作为参数提供给这个函数。例如,包gclus中提供了创建增强型散点图的函数。可以使用命令install.packages("gclus")来下载和安装它。

一个包仅需安装一次。但和其他软件类似,包经常被其作者更新。使用命令update.packages()可以更新已经安装的包。要查看已安装包的描述,可以使用installed.packages()命令,这将列出安装的包,以及它们的版本号、依赖关系等信息。

1.4.3 包的载入

包的安装是指从某个CRAN镜像站点下载它并将其放入库中的过程。要在R会话中使用它,还需要使用library()命令载入这个包。例如,要使用gclus包,执行命令library(gclus)即可。当然,在载入一个包之前必须已经安装了这个包。在一个会话中,包只需载入一次。如果需要,你可以自定义启动环境以自动载入会频繁使用的那些包。启动环境的自定义在附录B中有详细描述。

1.4.4 包的使用方法

载入一个包之后,就可以使用一系列新的函数和数据集了。包中往往提供了演示性的小型数据集和示例代码,能够让我们尝试这些新功能。帮助系统包含了每个函数的一个描述(同时带有示例),每个数据集的信息也被包括其中。命令help(package="package_name")可以输出某个包的简短描述以及包中的函数名称和数据集名称的列表。使用函数help()可以查看其中任意函数或数据集的更多细节。这些信息也能以PDF帮助手册的形式从CRAN下载。

R语言编程中的常见错误

有一些错误是R的初学者和经验丰富的R程序员都可能常犯的。如果程序出错了,请检查以下几方面。

  • 使用了错误的大小写。help()Help()HELP()是三个不同的函数(只有第一个是正确的)。

  • 忘记使用必要的引号。install.packages("gclus")能够正常执行,然而Install.packages(gclus)将会报错。

  • 在函数调用时忘记使用括号。例如,要使用help()而非help。即使函数无需参数,仍需加上()

  • 在Windows上,路径名中使用了\R将反斜杠视为一个转义字符。

    setwd("c:\mydata")会报错。正确的写法是setwd("c:/mydata")setwd("c:\\mydata")

  • 使用了一个尚未载入包中的函数。函数order.clusters()包含在包gclus中。如果还没有载入这个包就使用它,将会报错。

R的报错信息可能是含义模糊的,但如果谨慎遵守了以上要点,就应该可以避免许多错误。

1.5 批处理

多数情况下,我们都会交互式地使用R:在提示符后输入命令,接着等待该命令的输出结果。偶尔,我们可能想要以一种重复的、标准化的、无人值守的方式执行某个R程序。例如,你可能需要每个月生成一次相同的报告,这时就可以在R中编写程序,在批处理模式下执行它。

如何以批处理模式运行R与使用的操作系统有关。在Linux或Mac OS X系统下,可以在终端窗口中使用如下命令:

R CMD BATCH options infile outfile

其中infile是包含了要执行的R代码所在文件的文件名,outfile是接收输出文件的文件名,options部分则列出了控制执行细节的选项。依照惯例,infile的扩展名是.R,outfile的扩展名为.Rout。

对于Windows,则需使用:

"C:\Program Files\R\R-3.1.0\bin\R.exe" CMD BATCH --vanilla --slave "c:\my projects\myscript.R"

将路径调整为R.exe所在的相应位置和脚本文件所在位置。要进一步了解如何调用R,包括命令行选项的使用方法,请参考CRAN(http://cran.r-project.org)上的文档“Introduction to R”2

2中文版文档名为“R导论”。CRAN上的下载地址为http://cran.r-project.org/doc/contrib/Ding-R-intro_cn.pdf。——译者注

1.6 将输出用为输入:结果的重用

R的一个非常实用的特点是,分析的输出结果可轻松保存,并作为进一步分析的输入使用。让我们通过一个R中已经预先安装好的数据集作为示例阐明这一点。如果你无法理解这里涉及的统计知识,也别担心,我们在这里关注的只是一般原理。

首先,利用汽车数据mtcars执行一次简单线性回归,通过车身重量(wt)预测每加仑行驶的英里数(mpg)。可以通过以下语句实现:

lm(mpg~wt, data=mtcars)

结果将显示在屏幕上,不会保存任何信息。

下一步,执行回归,区别是在一个对象中保存结果:

lmfit <- lm(mpg~wt, data=mtcars)

以上赋值语句创建了一个名为lmfit的列表对象,其中包含了分析的大量信息(包括预测值、残差、回归系数等)。虽然屏幕上没有显示任何输出,但分析结果可在稍后被显示和继续使用。

键入summary(lmfit)将显示分析结果的统计概要,plot(lmfit)将生成回归诊断图形,而语句cook<-cooks.distance(lmfit)将计算和保存影响度量统计量3plot(cook)对其绘图。要在新的车身重量数据上对每加仑行驶的英里数进行预测,不妨使用predict(lmfit, mynewdata)

3这里使用了Cook距离作为度量影响的统计量,详见第8章。——译者注

要了解某个函数的返回值,查阅这个函数在线帮助文档中的“Value”部分即可。本例中应当查阅help(lm)?lm中的对应部分。这样就可以知道将某个函数的结果赋值到一个对象时,保存下来的结果具体是什么。

1.7 处理大数据集

程序员经常问我R是否可以处理大数据问题。他们往往需要处理来自互联网、气候学、遗传学等研究领域的海量数据。由于R在内存中存储对象,往往会受限于可用的内存量。举例来说,在我服役了5年的2G内存Windows PC上,我可以轻松地处理含有1000万个元素的数据集(100个变量×100 000个观测)。在一台4G内存的iMac上,我通常可以不费力地处理含有上亿元素的数据。

但是也要考虑到两个问题:数据集的大小和要应用的统计方法。R可以处理GB级到TB级的数据分析问题,但需要专门的手段。大数据集的管理和分析问题留待附录F中讨论。

1.8 示例实践

我们将以一个结合了以上各种命令的示例结束本章。以下是任务描述。

(1) 打开帮助文档首页,并查阅其中的“Introduction to R”。

(2) 安装vcd包(一个用于可视化类别数据的包,你将在第11章中使用)。

(3) 列出此包中可用的函数和数据集。

(4) 载入这个包并阅读数据集Arthritis的描述。

(5) 显示数据集Arthritis的内容(直接输入一个对象的名称将列出它的内容)。

(6) 运行数据集Arthritis自带的示例。如果不理解输出结果,也不要担心。它基本上显示了接受治疗的关节炎患者较接受安慰剂的患者在病情上有了更多改善。

(7) 退出。

所需的代码如代码清单1-3所示,图1-7显示了结果的示例。如本例所示,我们只需使用少量R代码即可完成大量工作。

代码清单1-3 使用一个新的包

help.start()
install.packages("vcd")
help(package="vcd")
library(vcd)
help(Arthritis)
Arthritis
example(Arthritis)
q()

{%}

图 1-7 代码清单1-3的输出。(从左至右)为关节炎示例的输出结果、帮助文档首页、vcd包的信息、Arthritis数据集的信息,以及一幅展示关节炎治疗情况和治疗结果之间关系的图

1.9 小结

本章中,我们了解了R的一些优点,正是这些优点吸引了学生、研究者、统计学家以及数据分析师等希望理解数据所具有意义的人。我们从程序的安装出发,讨论了如何通过下载附加包来增强R的功能。探索了R的基本界面,以交互和批处理两种方式运行了R程序,并绘制了一些示例图形。还学习了如何将工作保存到文本和图形文件中。由于R的复杂性,我们花了一些时间来了解如何访问大量现成可用的帮助文档。希望你对这个免费软件的强大之处有了一个总体的感觉。

既然已经能够正常运行R,那么是时候把玩你自己的数据了。在下一章中,我们将着眼于R能够处理的各种数据类型,以及如何从文本文件、其他程序和数据库管理系统中导入数据。

目录

  • 版权声明
  • 对第1版的赞誉
  • 致谢
  • 前言
  • 关于本书
  • 关于封面图片
  • 第一部分 入门
  • 第 1 章 R语言介绍
  • 第 2 章 创建数据集
  • 第 3 章 图形初阶
  • 第 4 章 基本数据管理
  • 第 5 章 高级数据管理
  • 第二部分 基本方法
  • 第 6 章 基本图形
  • 第 7 章 基本统计分析
  • 第三部分 中级方法
  • 第 8 章 回归
  • 第 9 章 方差分析
  • 第 10 章 功效分析
  • 第 11 章 中级绘图
  • 第 12 章 重抽样与自助法
  • 第四部分 高级方法
  • 第 13 章 广义线性模型
  • 第 14 章 主成分分析和因子分析
  • 第 15 章 时间序列
  • 第 16 章 聚类分析
  • 第 17 章 分类
  • 第 18 章 处理缺失数据的高级方法
  • 第五部分 技能拓展
  • 第 19 章 使用ggplot2进行高级绘图
  • 第 20 章 高级编程
  • 第 21 章 创建包
  • 第 22 章 创建动态报告
  • 第 23 章 使用lattice进行高级绘图
  • 附录 A 图形用户界面
  • 附录 B 自定义启动环境
  • 附录 C 从R中导出数据
  • 附录 D R中的矩阵运算
  • 附录 E 本书中用到的扩展包
  • 附录 F 处理大数据集
  • 附录 G 更新R
  • 后记:探索R的世界
  • 参考文献