R语言统计分析与应用

978-7-115-46982-3
作者: 汪海波
译者:
编辑: 张爽
分类: R语言

图书目录:

详情

本书以Windows操作系统下的R软件为基础,以实践中常用的统计分析方法为基本内容,介绍了R语言的编写以及结果解释。本书重点介绍了各种多元统计分析方法的基本原理及其应用,包括方差分析、多元线性回归、Logistic回归分析、生存分析、主成分分析、因子分析、聚类分析、判别分析以及典型相关分析等。

图书摘要

版权信息

书名:R语言统计分析与应用

ISBN:978-7-115-46982-3

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

著    汪海波 罗 莉 汪海玲

责任编辑 张 涛

执行编辑 张 爽

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(76010)81055315


R统计软件是目前应用最广泛的统计软件之一,已广泛应用于医学、财经和社会科学等领域中进行数据管理和数据分析处理。本书以Windows操作系统下的R软件为基础,以实践中常用的统计分析方法为基本内容,介绍了R语言的编写以及结果解释。本书重点介绍了各种多元统计分析方法的基本原理及其应用,包括方差分析、多元线性回归、Logistic回归分析、生存分析、主成分分析、因子分析、聚类分析、判别分析以及典型相关分析等。每一章详细讨论了统计分析方法的基本原理和分析过程,介绍了R语言的使用方法及应用实例说明、结果解释及结论分析等。

本书可以作为数据分析和数据管理人员的参考用书,也可以作为高等院校相关专业的教材。


R是世界领先的信息系统,是一个大型规模化的集成应用软件,具有完备的数据存取、管理、分析和显示的功能。R统计分析软件使用灵活方便、功能齐全,R语言编程能力强且简单易学,其数据处理和统计分析融为一体,已被广泛应用于医学、财经和社会科学等领域中。R是一个开源项目,在很多操作系统上都可以免费使用,包括Windows、Mac OS X和Linux。R还在持续发展中,每天都在纳入新的功能。R已经成了统计、预测分析和数据可视化的全球通用语言。它提供各种用于分析和理解数据的方法,从最基础的到最前沿的,无所不包。R以能创建漂亮优雅的图形而闻名,但实际上它可以处理各种统计问题。基本的安装版本就提供了数以百计的数据管理、统计和图形函数。

本书是一本R指南,高度概括了该软件和它的强大功能。本书介绍了基本安装中最重要的函数,以及重要扩展包中的函数。整本书都是围绕实际应用展开的,你将学会理解数据,并能够与他人交流对数据的理解。通读本书,你会对R的原理和功能有基本的了解,并知道可以从什么地方学习更多的相关知识。你将能用各种技术实现数据可视化,还能解决各种难度的数据分析问题。

本书内容充实、重点突出、实用性强,不仅介绍了常用的统计分析方法,也详细阐述了多元统计分析方法及其应用,例如方差分析、生存分析等,是较完整地覆盖多元统计分析方法的一本参考书,适合不同层次的人员使用。本书对每一种多元统计分析方法的基本原理、分析过程进行了详细的阐述,并介绍了R函数的使用方法、应用实例说明、结果解释、结论分析等,使读者可以将统计分析方法与R软件应用结合起来学习,全面掌握统计分析方法。统计基础知识比较薄弱者可以忽略计算公式等理论部分,把重点放在对基本原理的理解和利用计算机解决实际问题上。统计基础知识较好者可以精读每一部分内容,使自己的统计分析能力达到更高的一个层次,并为今后进一步学习和研究打下扎实的实践基础。本书适合医学、经济学、农业等多个领域的人员参考。

本书在编写方法上有所创新。目前,许多统计分析教程存在理论和实践操作脱节,或者说计算例题和解决实际问题脱节的现象,使得多元统计在研究上的应用价值不能真正体现出来。本书从讲求实效的原则出发,将统计分析原理和R软件的输出结果有机地结合在一起,将理论学习与实际操作融为一体,使得读者有机会把各种统计分析方法的理论知识同解决实际问题的能力结合起来。

本书第1章介绍了R的特点以及结构组成,R的获取、安装和启动,如何用网上的扩展包增强R基本安装的功能,R菜单操作,用户界面,如何以交互方式和批处理方式运行程序,R系统的文件管理。第2章介绍了R编程入门,包括数据集的建立以及各种操作方法等,同时讲解了向R中导入数据的诸多方法。这一章的前半部分介绍了如何用R来存储数据的数据结构,以及如何用键盘输入数据;后半部分介绍了怎样从文本文件、网页、电子表格、统计软件和数据库向R导入数据,涵盖了数据管理中函数(数学函数、统计函数、字符函数)以及常用运算符。第3章探讨了基本的数据管理,包括数据集的排序、合并、取子集,以及变量的转换、重编码和删除。第4章介绍了样本量和检验效能估计。第5章在第3章的基础上介绍了高级数据管理方法,涵盖了控制结构(循环、条件执行)的用法,然后介绍如何编写自己的R函数,以及如何用不同的方法整合数据。第6章概括地总结了定量资料基本统计分析方法的主要内容。从第7章开始逐个介绍了工作实践中常用的一些多元统计分析方法,内容包括各种多元统计分析方法的基本原理、计算方法、分析步骤、实例应用、R函数和使用方法,以及结果解释和结论分析等;介绍了针对一个数值型结果变量与一系列数值型预测变量间的关系进行建模的回归方法,并详细给出了拟合模型的方法、适用性评价和含义解释,包括t检验、方差分析、直线回归和相关、多元线性回归与相关、Logistic回归分析。第12章介绍了相对数的概念、率假设检验方法和R程序。第13章介绍了行×列表分析和交叉表。第14章探讨了非参数分析方法,包括配对及单样本秩和检验、两组样本比较的秩和检验、多组样本比较的秩和检验及两两比较、等级分组资料和随机区组设计资料比较的秩和检验及两两比较。第15章介绍了生存分析,主要涉及生存率的两种估计方法,乘积极限法和寿命表法,以及Cox模型。多元数据分析的一个难点是简化数据。后续章节介绍了如何将大量的相关变量转换成较少的不相关变量(主成分分析),以及如何发现一系列变量中的潜在结构(因子分析)。这些方法涉及许多步骤,每一步都有详细的介绍。第16~20章分别阐述了主成分分析、因子分析、聚类分析、判别分析和典型相关分析。从第21章开始探讨了R软件的拓展应用,包括ROC分析和统计图,所涉及的统计图包括条形图、饼图、散点图、折线图、箱线图、直方图、核密度图和点图。另外,本书每一章都给出了使用R软件进行数据分析的实例,以帮助读者理解和掌握各章的内容。

本书附带所有实例操作的数据和R程序。

本书由汪海波、罗莉、汪海玲编著,参与编写的还有郝旭宁、李建鹏、赵伟茗、刘钦、于志伟、张永岗、周世宾、姚志伟、曹文平、张应迁、张洪才、邱洪钢、张青莲、陆绍强、李成。

本书可以作为从事数据分析和数据管理工作人员的参考用书,以及有关科研人员和科研管理者进一步提高统计分析水平的参考书,也可以作为高等院校师生的统计教材。

因编者水平有限,不妥之处敬请读者提出宝贵意见,联系邮箱为zhangtao@ ptpress.com.cn。

编 者



学习目标

内容概要

R是允许用户编辑算法并使用其他可编程工具的一种计算机语言,具有完备的数据存取、管理、分析和显示等功能,是现今最受欢迎的数据分析和可视化平台之一,是一种针对统计分析和数据科学的功能全面的开源统计语言。它是自由的开源软件,并同时提供Windows、Mac OS X 和Linux 系统的各种版本。它在商业、工业、政府部门、医药和科研等涉及数据分析的领域都有广泛的应用。

本章对R软件和R系统的特点进行了较详细的介绍,描述了R软件的要求和环境支持。希望大家对R系统能够有较全面的了解。首先简要介绍了R,以及它作为数据分析平台的诸多特性。本章主要介绍了R的获取,以及如何用网上的扩展包增强R基本安装的功能。另外,本章还介绍了用户界面,以及如何以交互方式和批处理方式运行程序。同时简要地介绍了R的安装和启动,对R菜单操作也进行了详细的讲解,尤其是那些R操作中经常应用的菜单。R虽然是编程软件,但是菜单操作仍有非常重要的作用。

R语言是从S统计绘图语言演变而来的,S语言在20世纪70年代诞生于贝尔实验室,由Rick Becker、John Chambers和Allan Wilks开发。基于S语言开发的商业软件Splus,可以方便地编写函数、建立模型,具有良好的扩展性,在国外学术界应用很广。1995年,新西兰奥克兰大学统计系的Robert Gentleman和Ross Ihaka基于S语言的源代码,编写了一个能执行S语言的软件,并将该软件的源代码全部公开,这就是R软件,其命令统称为R语言。

与起源于贝尔实验室的S语言类似,R也是一种为统计计算和绘图而生的语言和环境,它是一套开源的数据分析解决方案,由一个庞大且活跃的全球性研究型社区维护。R的特点如图1-1所示。

具体来说,R有以下7个方面的特点。

(1)完全免费,软件本身及程序包的源代码公开。多数商业统计软件价格不菲,投入成千上万美元都是有可能的。

(2)丰富的资源,涵盖了多种行业数据分析中几乎所有的方法。R是一个全面的统计研究平台,提供了各式各样的数据分析技术,几乎任何类型的数据分析工作皆可在R中完成。

▲图1-1 R的特点

(3)交互式平台。R是一个可进行交互式数据分析和探索的强大平台,任意一个分析步骤的结果均可被轻松保存、操作,并作为进一步分析的输入。有各式各样的图形用户界面工具通过菜单和对话框提供了与R语言同等的功能。

(4)扩展性强。编写函数和程序包十分方便,跨平台,可以胜任复杂的数据分析、绘制精美的图形。R拥有顶尖水准的制图功能。如果希望复杂数据可视化,那么R拥有最全面且最强大的一系列可用功能。

(5)适用性强。R可运行于多种平台之上,包括Windows、UNIX和Mac OS X。这基本上意味着它可以运行于你所能拥有的任何计算机上。R可以轻松地从各种类型的数据源导入数据,包括文本文件、数据库管理系统、统计软件,乃至专门的数据仓库。它同样可以将数据输出并写入这些系统中。

(6)应用面广。R适用于几乎任何应用的需要。目前在R网站上约有2400个程序包,涵盖了基础统计学、社会学、经济学、生态学、空间分析、系统发育分析、生物信息学等诸多方面。R可用来解决自然科学和社会科学领域中的各种问题,如统计学、社会学、经济学、生物、医疗卫生等,其功能包括图形显示、数据分析、数据输入、数据检查、数据管理、报表生成、统计计算、市场研究、销售管理、供应管理、调查分析和建立预测模型等。

(7)完备的帮助系统。每个函数都有统一格式的帮助,运行实例。

R的官方网页拥有大量英文学习资源,还可以参考http://cran.r-project.org/other-docs.html 上的中文翻译文档。统计之都BBS是一个不错的学习R的中文网站,你可以在这个论坛中找到大量学习资料或直接提出问题同大家探讨。

R 的帮助系统非常强大,可以直接使用\?topic或help(topic)来获取topic的帮助信息,也可使用help.search("topic")来搜索帮助系统。如果你只知道函数的部分名称,那么可以使用apropos("tab") 来搜索得到载入内存所有包含tab字段的函数。如果还没有得到需要的资料,还有R Site Search:http://finzi.psych.upenn.edu/search.html,等价于在R平台上使用RSiteSearch()函数。

正如大家应用R的过程中看到的,大部分经典的R书籍都为英文版的,例如:

Modern Applied Statistics with S(Venables and Ripley)

The New S Language: A Programming Environment for Data Analysis and Graphics(Richard A. Becker,John M. Chambers,Allan R.Wilks)

A Handbook of Statistical Analysis Using R(Brian S. Everitt,Torsten Hothorn)

Data Analysis and Graphics using R(Maindonald and Braun)

Introductory Statistics with R(Dalgaard)

R可以在CRAN(Comprehensive R Archive Network)网站http://cran.r-project.org中免费下载,如图1-2所示。CRAN由世界上的几十个镜像网站组成网络,提供下载安装程序和相应软件包,各镜像更新频率一般为1~2天。Linux、Mac OS X和Windows都有相应编译好的二进制版本。根据所选择平台的安装说明进行安装即可。

▲图1-2 R的下载界面(1)

推荐镜像如下:

中国的镜像——数学所,http://ftp.ctex.org/mirrors/CRAN。

即时更新的CRAN源,http://cran.r-project.org。

由于大部分人都是用Windows系统,以“R for Windows”为例说明如何下载和安装R。单击“Download R for Windows”进入下载界面,如图1-3所示。

▲图1-3 R的下载界面(2)

继续选择“install R for the first time”。

选择“Download R 3.2.2 for Windows (62 megabytes, 32/64 bit)”,即可下载所需要的R软件了,如图1-4所示。

▲图1-4 R的下载界面(3)

安装方法与其他Windows下的软件安装一样。下面介绍R的安装方法。

(1)双击下载的R程序,启动安装程序,如图1-5所示。

▲图1-5 R的安装(1)

(2)选择安装时使用的语言。为了保持较好的运行效果,最好选择英文,如图1-6所示。

▲图1-6 R的安装(2)

(3)R的安装界面如图1-7和图1-8所示。

▲图1-7 R的安装(3)

▲图1-8 R的安装(4)

(4)按照对话框的提示选择安装目录,如图1-9所示。

▲图1-9 R的安装(5)

(5) 如有必要,可单击“Browse”更改安装目录,如图1-10所示。

▲图1-10 R的安装(6)

(6)选择需要安装的R组件,“Core files”和“Message translations”为默认选择,根据操作系统选择32位或64位文件之一即可,如图1-11所示。

▲图1-11 R的安装(7)

(7)指定安装选项,可以自行设定或默认安装,本例选择默认安装,如图1-12所示。

▲图1-12 R的安装(8)

(8)选择是否在“开始”菜单创建快捷方式,如图1-13所示。

▲图1-13 R的安装(9)

(9)选择附加安装选项,如图1-14所示。

▲图1-14 R的安装(10)

R的启动的常用方法有两种:一是快捷方式,即按创建Windows系统中应用程序的快捷方式的步骤,把R目录中的R.EXE拖放至桌面,形成快捷方式,用鼠标双击快捷方式即可启动R;二是菜单方式,从“开始”菜单的程序文件夹中找到R系统文件夹,启动R系统。启动后会出现如图1-15所示的R的运行界面。

▲图1-15 R的运行界面

R主窗口标题栏下是主菜单。

(1)【文件】菜单主要是有关R文件调入、保存、转换及打印等功能命令,如图1-16所示。

▲图1-16 【文件】菜单

(2)【编辑】菜单为文本编辑“菜单”,可以对文本进行清空、复制、粘贴和数据编辑等操作,如图1-17所示。

▲图1-17 【编辑】菜单

(3)【查看】菜单用于指定是否显示工具栏和状态栏。

(4)【程序包】菜单用于加载、安装和更新程序包的窗口,如图1-18所示。

▲图1-18 【程序包】菜单

(5)【帮助】菜单:R的帮助系统非常强大,可以通过多种途径寻求帮助。【帮助】菜单中有手册、网站链接、搜索等多种帮助形式,如图1-19所示。

▲图1-19 【帮助】菜单

R提供了大量的帮助功能,学会如何使用这些帮助文档有助于将来的编程工作。R的内置帮助系统提供了当前已安装包中所有函数的细节、参考文献以及使用示例。帮助文档可以通过以下函数进行查看。

函数help.start()会打开一个浏览器窗口,查看帮助手册(入门和高级)、常见问题集,以及参考材料。函数RSiteSearch()可在在线帮助手册和R-Help邮件列表中搜索指定主题。由函数vignette()函数返回的vignette文档一般是PDF格式的实用介绍性文章。总之,R提供了大量的帮助功能,学会如何使用这些帮助文档,毫无疑问地会有助于编程。

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

当前的工作目录是R用来读取文件和保存结果的默认目录。我们可以使用函数getwd()来查看当前的工作目录,或使用函数setwd()设定当前的工作目录。如果需要读取一个不在当前工作目录下的文件,则需在调用语句中写明完整的路径。记得使用引号闭合这些目录名和文件名。

用于管理工作空间的部分标准命令如下。


重点提示: 

setwd()命令的路径中使用了正斜杠(/)。R将反斜杠(\)作为一个转义符。即使在Windows平台上运行R,在路径中也要使用正斜杠。


R提供了大量备用功能,通过可选模块的下载和安装来实现。目前有2500多个称为包的用户贡献模块可从http://cran.r-project.org/web/packages下载。这些包提供了横跨各种领域、数量庞大的新功能,包括分析地理数据、处理蛋白质质谱,甚至是心理测验分析的功能。

R程序包是多个函数的集合,具有详细的说明和示例。Windows下的R程序包是经过编译的zip包。每个程序包包含R函数、数据、预编译代码、帮助文件、描述文件等。计算机上存储包的目录称为库。函数.libPaths()能够显示库所在的位置,函数library()则可以显示库中有哪些包。R自带了一系列默认包(包括base、datasets、utils、grDevices、graphics、stats以及methods),它们提供了种类繁多的默认函数和数据集。其他包可通过下载来进行安装。安装好以后,它们必须被载入会话中才能使用。

R程序包是R功能扩展特定的分析功能,需要用相应的程序包实现。例如:系统发育分析常用到ape程序包、群落生态学vegan包等。常用的安装包有以下几种。

CRAN提供了每个包的源代码和编译好的程序包,有许多R函数可以用来管理包。第一次安装一个包,使用命令install.packages()即可。不加参数执行install.packages()将显示一个CRAN镜像站点的列表,选择其中一个镜像站点之后,将看到所有可用包的列表,选择其中的一个包即可进行下载和安装。如果知道自己想安装的包的名称并已经连接到互联网,可以直接将包名作为参数提供给这个函数。在括号中输入要安装的程序包名称,选择镜像后,程序将自动下载并安装程序包。一个包仅需安装一次。但和其他软件类似,包经常被其作者更新。使用命令update.packages()可以更新已安装的包。要查看已安装包的描述,可以使用installed.packages()命令,这将列出安装的包,以及它们的版本号、依赖关系等信息。

Windows下的程序包为zip文件,安装时不要解压缩。路径为“Packages>install packages from local files”,选择本地磁盘上存储zip包的文件夹。

包的安装是从某个CRAN镜像站点下载包,并将其放入库中的过程。程序包中的函数,都要先导入再使用,因此导入程序包是第一步。需要使用library()命令载入这个包,程序包内的函数的用法与R内置的基本函数用法一样。在载入一个包之前必须已经安装了这个包。在一次应用中,包只需载入一次。如果需要,你可以自定义启动环境以自动载入会频繁使用的那些包。

载入一个包之后,就可以使用一系列新的函数和数据集了。包中往往提供了演示性的小型数据集和示例代码,能够让我们尝试这些新功能。帮助系统包含了每个函数的一个描述(同时带有示例),每个数据集的信息也被包括其中。查询程序包内容最常用的方法包括菜单和查看PDF帮助文档。

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

R中的多数功能是由程序内置函数和用户自编函数提供的,一次交互式会话期间的所有数据对象都被保存在内存中。一些基本函数是默认直接可用的,而其他高级函数则包含于按需加载的程序包中。R语句由函数和赋值构成。R使用“<-”,而不是传统的“=”作为赋值符号。


重点提示: 

R允许使用“=”为对象赋值。但是这样写的R程序并不多,因为它不是标准语法,某些情况下会出现问题。


R commander是R的图形界面之一,由John Fox教授编写。随着用户的操作,其窗口还可以显示出相应操作的R程序,对于初学者可能会有帮助。

安装R commander的程序如下:

install.packages("Rcmdr")

R将自动下载并安装Rcmdr所需的所有程序包。R commander图形界面如图1-20所示。

▲图1-20 R commander图形界面

上面第一个窗口为“界面操作代码”显示窗口,第二个窗口为结果输出窗口。界面操作直观易学,但也存在一些不足:操作的过程难以保存,数据处理不够灵活,在进行步骤繁多的数据处理工作时十分费时费力,在建立模型或自己编写函数时也会遇到困难,而这些困难可以通过编程解决。要学习R编程,首先要了解R的函数、对象及其操作。

R是一个开源项目,在很多操作系统上都可以免费得到,包括Windows、Mac OS X和Linux。R还在持续发展中,每天都在纳入新的功能。R具有完备的数据存取、管理、分析和显示等功能,在世界范围内被广泛应用于政府、科研、教育和生产等不同的领域,发挥着积极的作用。R具有使用灵活方便、功能齐全、编程能力强且简单易学、数据处理和统计分析融为一体、扩展性强、适用性强、应用面广等特点。

在本章中,我们了解了R的一些优点和局限性,以及它作为数据分析平台的诸多特性。本章主要介绍了R的获取,以及如何用网上的扩展包增强R基本安装的功能。我们从程序的安装出发,讨论了如何通过下载附加包来增强R的功能。探索了R的基本界面,以交互和批处理两种方式运行了R程序,还学习了如何将工作保存到文本和图形文件中。由于R的复杂性,我们花了一些篇幅来了解如何访问大量现成可用的帮助文档,希望读者了解到这个免费软件的强大之处。


学习目标

内容概要

R提供了一种完善的编程语言。R语言类似计算机的高级语言,用户只需要熟悉其命令、语句及简单的语法规则,就可以做数据管理和分析处理工作。因此,掌握R编程技术是学习R的关键环节。同其他的计算机语言一样,R语言也有它自己的语言和句法、函数与其他辅助信息的规则,用户可使用R语言来定义数据和规定对数据做统计分析。

在利用R进行数据整理和分析之前,首先必须将数据直接输入R数据集中,或者把其他格式的数据文件转换为R数据集。一旦创建了R数据集,我们就可以对R数据集进行各种分析处理并打印计算结果的计算机程序。

R提供了一种完善的编程语言。类似计算机的高级语言,R用户只需要熟悉其命令、语句及简单的语法规则,就可以做数据管理和分析处理工作。因此,掌握R编程技术是学习R的关键环节。在R中,把大部分常用的复杂数据计算的算法作为标准函数调用,用户仅需要指出函数名及其必要的参数即可。这一特点使得R编程十分简单。

R是一种解释性语言,输入后可直接给出结果。R功能靠函数实现。函数形式如下:

函数(输入数据,参数= )

如果没有指定,则参数以默认值为准。

例如:平均值 mean(x, trim = 0, na.rm = FALSE, ...),线性模型 lm(y~x, data=test)。

每一个函数执行特定的功能,后面紧跟括号,例如:平均值 mean()、求和 sum()、绘图plot()、排序sort()。

除了基本的运算之外,R的函数又分为“高级”和“低级”函数,高级函数可调用低级函数,这里的“高级”函数习惯上称为泛型函数。如plot()就是泛型函数,可以根据数据的类型,调用底层的函数,应用相应的方法绘制相应的图形。这就是面向对象编程的思想。

创建含有研究信息的数据集,这是任何数据分析的第一步。在R中,这个任务包括以下两步。

数据集通常是由数据构成的一个矩形数组,行表示观测,列表示变量。不同的行业对于数据集的行和列叫法不同,包括观测和变量、记录和字段、示例和属性。

R可以处理的数据类型包括数值型、字符型、逻辑型(TRUE/FALSE)、复数型(虚数)和因子型,实例如下。

R中有许多用于存储数据的结构,包括标量、向量、数组、数据框和列表。多样化的数据结构赋予了R极其灵活的数据处理能力,各种类型的数据是由各元素组成的。


注意: 

标量是只含一个元素的向量,例如f <−3、g <−"US"和h <−TRUE。它们用于保存常量。



重点提示: 

与其他标准统计软件中的数据集类似,数据框是R中用于存储数据集的一种主要数据结构:列表示变量,行表示观测。在同一个数据框中可以存储不同类型(如数值型、字符型)的变量。


(1)向量。

向量为一系列元素的组合,用于存储数值型、字符型或逻辑型数据的一维数组。执行组合功能的函数c()可用来创建向量,各类向量如下所示:

a <- c(1, 2, 3, 4, 10, -9, 20)
b <- c("one",  "two",  "three")
c <- c(TURE, FALSE, TRUE, TRUE, FALSE, FALSE)
d <- c("a", "a", "b", "b", "c")

其中,a是数值型向量,b和d是字符型向量,而c是逻辑型向量。


重点提示: 

单个向量中的数据必须拥有相同的类型或模式(数值型、字符型或逻辑型),同一向量中无法混杂不同模式的数据。


通过在方括号中给定元素所处位置的数值访问向量中的元素。例如,a[c(1, 4)]用于访问向量a中的第1个和第4个元素。更多示例如下:

> d <- c(1, 3, 5, 9,7, 10, 23, 21, 17)
> d[2]
[1] 3
> d[2:5]
[1] 3 5 9 7
> d[c(1,2,6,7)]
[1]  1  3 10 23

第2个语句中使用的冒号用于生成一个数值序列,d[2:5]相当于d[c(2, 3, 4, 5)]。

(2)矩阵。

矩阵是一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型),可通过函数matrix创建矩阵。一般使用格式如下:

mymatrix  <-  matrix (vector, nrow=, ncol=, byrow=, dimnames=list() )

其中,vector包含了矩阵的元素,nrow和ncol用以指定行和列的维数,dimnames包含了可选的、以字符型向量表示的行名和列名。选项byrow则表明矩阵应当按行填充(byrow=TRUE)还是按列填充(byrow=FALSE),默认情况下按列填充。

> x <-  matrix(21:40, nrow=4, ncol=5, byrow=FALSE)
> x
     [,1]   [,2]  [,3]  [,4]  [,5]
[1,]   21   25   29   33   37
[2,]   22   26   30   34   38
[3,]   23   27   31   35   39
[4,]   24   28   32   36   40
> fourcell <- c(1,2,3,10,20,30)
> rnames <- c("R1", "R2")
> cnames <- c("C1", "C2", "C3")
> mymatrix  <-  matrix (fourcell, nrow=2, ncol=3, byrow=TRUE, dimnames=list(rnames, cnames))
> mymatrix
   C1 C2 C3
R1  1  2  3
R2 10 20 30 
> mymatrix1  <-  matrix (fourcell, nrow=2, ncol=3, byrow=FALSE, dimnames=list(rnames, cnames))
> mymatrix1
   C1 C2 C3
R1  1  3 20
R2  2 10 30

我们首先创建了一个4×5的矩阵,接着创建了一个2×3的含列名标签的矩阵并按行进行填充,最后创建了一个2×3的矩阵并按列进行了填充。

我们可以使用下标和方括号来选择矩阵中的行、列或元素。X[i,]指矩阵X中的第i行,X[,j]指第j列,X[i, j]指第i行第j个元素。选择多行或多列时,下标ij可为数值型向量。

> aa <-matrix(1:20, nrow=5)
> aa
     [,1]   [,2]  [,3]  [,4]
[1,]    1    6   11   16
[2,]    2    7   12   17
[3,]    3    8   13   18
[4,]    4    9   14   19
[5,]    5   10   15   20
> aa[3,]
[1]  3  8 13 18
> aa[,3]
[1] 11 12 13 14 15
> aa[3,3]
[1] 13
> aa[3,c(3,4)]
[1] 13 18
> aa[,c(3,4)]
     [,1] [,2]
[1,]   11   16
[2,]   12   17
[3,]   13   18
[4,]   14   19
[5,]   15   20

首先,我们创建了一个内容为数字1~20的5×4矩阵。默认情况下,矩阵按列填充。然后分别选择了第 3 行和第 3 列的元素。接着,又选择了第 3 行第 3 列的元素。之后选择了位于第3行第3、第4列的元素。最后选择了第3列和第4列的元素。

矩阵都是二维的,与向量类似,矩阵中也仅能包含一种数据类型。当维度超过2时,需要使用数组;当有多种模式的数据时,需要使用数据框。

(3)数组。

数组与矩阵类似,但其维度可大于2。数组可通过array函数创建,形式如下:

setarray  <- array (vector, dimensions, dimnames)

其中,vector包含了数组中的数据;dimensions是一个数值型向量,给出了各个维度下标的最大值;而dimnames是可选的、各维度名称标签的列表。

> dim1 <- c("X1", "X2")
> dim2 <- c("Y1", "Y2", "Y3")
> dim3 <- c("Z1", "Z2", "Z3", "Z4")
> xyz <- array(1:24, c(4,3,2), dimnames=list(dim3, dim2, dim1))
> xyz
, , X1
   Y1 Y2 Y3
Z1  1  5  9
Z2  2  6 10
Z3  3  7 11
Z4  4  8 12

, , X2
   Y1 Y2 Y3
Z1 13 17 21
Z2 14 18 22
Z3 15 19 23
Z4 16 20 24

数组是矩阵的一个自然推广,它们在编写新的统计方法时可能很有用。像矩阵一样,数组中的数据也只能拥有一种模式。

从数组中选取元素的方式与矩阵相同。

> xyz[1,2,]
X1 X2 
 5 17
> xyz[1,3,]
X1 X2 
 9 21
> xyz[,2,2]
Z1 Z2 Z3 Z4 
17 18 19 20
> xyz[3,2,1]
[1] 7

(4)数据框。

与通常在SAS、SPSS和STATA中看到的数据集类似,不同的列可以包含不同模式(数值型、字符型等)的数据,也将是R中最常处理的数据结构。如果数据有多种模式,无法将此数据集放入一个矩阵,在这种情况下,使用数据框是最佳选择。数据框可通过函数data.frame()创建:

mydata  <- data.frame(col1, col2, col3, …)

其中,列向量col1, col2, col3,…可为任何类型(如字符型、数值型或逻辑型)。

> IDnumber  <- c(101, 102, 103, 104)
> age <- c(24, 78, 56, 45)
> hypertention  <- c("yes", "no", "no","yes")
> severity  <- c("high", "middle", "low", "middle")
> patientdata  <- data.frame(IDnumber, age, hypertention, severity)
> patientdata
  IDnumber age hypertention severity
1      101  24          yes     high
2      102  78           no   middle
3      103  56           no      low
4      104  45          yes   middle

选取数据框中元素的方式有若干种,既可以使用前述下标记号,也可以直接指定列名。

> patientdata[1]
  IDnumber
1      101
2      102
3      103
4      104
> patientdata[1:2]
  IDnumber age
1      101  24
2      102  78
3      103  56
4      104  45
> patientdata["age"]
  age
1  24
2  78
3  56
4  45
> patientdata[c("age", "severity")]
  age severity
1  24     high
2  78   middle
3  56      low
4  45   middle
> patientdata$age
[1] 24 78 56 45

记号$是新出现的使用方法,它被用来选取一个给定数据框中的某个特定变量。在每个变量名前都输入一次数据框名可能会让人生厌,所以不妨走一些捷径,可以联合使用函数attach()和detach(),或单独使用函数with()来简化代码。

函数attach()可将数据框添加到R的搜索路径中。R在遇到一个变量名以后,将检查搜索路径中的数据框,以定位到这个变量。使用以下代码获取年龄(age)变量的描述性统计量,并分别绘制此变量与收缩压(hypertension)的散点图。

> systolic <- c(120, 130, 140, 150, 160)
> age <- c(20, 30, 40, 50, 55)
> hypertension  <- data.frame(systolic, age)
>  hypertension 
     systolic age
1      120  20
2      130  30
3      140  40
4      150  50
5      160  55

> summary(hypertension$age)
> summary(hypertension$systolic)
> plot(hypertension$systolic, hypertension$age)

上述代码也可以改写成:

> attach(hypertension)
> summary(age)
> summary(systolic)
> plot(systolic, age)
> detach(hypertension)

函数detach()将数据框从搜索路径中移除。detach()并不会对数据框本身做任何处理,这句是可以省略的。

当名称相同的对象不止一个时,这种方法的局限性就很明显了,原始对象将进行优先运算。函数attach()和detach()最好在分析一个单独的数据框,并且不太可能有多个同名对象时使用。

除此之外,另一种方式是使用函数with()。可以这样重写上例:

>  with(hypertension,{
summary(age)
 summary(systolic)
plot(systolic, age)
})

大括号{}之间的语句都针对数据框hypertension执行,这样就不用担心名称冲突了。如果仅有一条语句,那么大括号{}可以省略。函数with()的局限性在于赋值仅在此函数的括号内生效。如下代码所示:

> with (hypertension, {stat <-summary(age) 
+  stat})
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
     20      30      40      39      50      55 
> stat
错误:找不到对象'stat'


重点提示: 

如果你需要创建在with()结构以外存在的对象,使用特殊赋值符“<<−”替代标准赋值符“<−”即可,它可将对象保存到with()之外的全局环境中。


以下代码较好地阐述了这个原因:

> with (hypertension, {nonstat <-summary(systolic) 
  stat <<-summary(systolic)
})
> nonstat 
错误: 找不到对象'nonstat'
> stat 
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    120     130     140     140     150     160

(5)因子。

变量可分为名义型、有序型或连续型变量。名义型变量是没有顺序之分的类别变量;有序型变量表示一种顺序关系,而非数量关系;连续型变量可以呈现为某个范围内的任意值并同时表示了顺序和数量。年龄就是一个连续型变量。类别(名义型)变量和有序类别(有序型)变量在R中称为因子。因子在R中非常重要,因为它决定了数据的分析方式以及如何进行结果展示。因子在R语言中具有许多强大运算的基础,包括许多针对表格数据的运算。因子的设计思想来源于统计学中的名义变量或分类变量,这些变量本质上不是数字,而是对应分类。例如血型,尽管可以用数字对它们进行编码。

函数factor()以一个整数向量的形式存储类别值,将一个由字符串(原始值)组成的内部向量映射到这些整数上。

> hypertention  <- c("yes", "no", "no","yes")
> hypertention <- factor(hypertention )
> hypertention 
[1] yes no  no  yes
Levels: no yes
> str(hypertention)
 Factor w/ 2 levels "no","yes": 2 1 1 2

语句hypertention <−factor(hypertention )将此向量存储为(2, 1, 1, 2),并在内部将其关联为1=no和2=yes(具体赋值根据字母顺序而定)。针对向量hypertention进行的任何分析都会将其作为名义型变量对待并自动选择合适的统计方法。

在R中,因子可以简单地看作一个附加更多信息的向量(尽管它们内部机理是不同的)。这额外的信息包括向量中不同值的记录,称为“水平”。

> x <-c(5,12,13,12)
> x <-factor(x)
> x
[1] 5  12 13 12
Levels: 5 12 13
> str(x)
 Factor w/ 3 levels "5","12","13": 1 2 3 2
> length(x)
[1] 4

x中的不同数值(5, 12, 13)就是水平。x的核心是(1,2,3,2),意味着我们的数据是由水平1、水平2和水平3的值构成的。因此数据已经重新编码为水平,当然水平本身也被记录。因子的长度定义为数据的长度,而不是水平的个数。

要表示有序型变量,需要为函数factor()指定参数ordered=TRUE。

> severity  <-  c("high", "middle", "low", "middle")
> severity <-  factor(severity, order=TRUE)
> severity
[1] high   middle low    middle
Levels: high < low < middle
> str(severity)
 Ord.factor w/ 3 levels "high"<"low"<"middle": 1 3 2 3

语句severity <− factor(severity, order=TRUE)将向量编码为(1, 3, 2, 3),并在内部将这些值关联为1= high、2= low以及3= middle。另外,针对此向量进行的任何分析都会将其作为有序型变量对待,并自动选择合适的统计分析方法。

对于字符型向量,因子的水平默认依字母顺序创建。这对于因子severity是没有意义的,因为“high”“low”“middle”的排序方式与逻辑顺序不一致。按默认的字母顺序排序的因子很少能够让人满意。

可以通过指定levels选项来覆盖默认排序。

> severity <-  factor(severity, order=TRUE, levels=c("low", "middle", "high"))

以下代码展现了因子如何影响数据分析结果。

> IDnumber  <- c(101, 102, 103, 104)
> age <- c(24, 78, 56, 45)
> hypertention  <- c("yes", "no", "no","yes")
>  severity  <- c("high", "middle", "low", "middle")
> hypertention <- factor(hypertention)
> severity  <- factor(severity, order=TRUE)
> patientdata  <- data.frame(IDnumber, age, hypertention, severity)
> str(patientdata)
'data.frame':   4 obs. of  4 variables:
 $ IDnumber    : num  101 102 103 104
 $ age         : num  24 78 56 45
 $ hypertention: Factor w/ 2 levels "no","yes": 2 1 1 2
 $ severity    : Ord.factor w/ 3 levels "high"<"low"<"middle": 1 3 2 3
> summary(patientdata)
    IDnumber          age        hypertention   severity
 Min.   :101.0   Min.   :24.00   no :2        high  :1  
 1st Qu.:101.8   1st Qu.:39.75   yes:2        low   :1  
 Median :102.5   Median :50.50                middle:2  
 Mean   :102.5   Mean   :50.75                          
 3rd Qu.:103.2   3rd Qu.:61.50                          
 Max.   :104.0   Max.   :78.00

(6)列表。

列表就是一些对象(或成分)的有序集合,是R数据类型中最为复杂的一种。列表允许整合若干(可能无关的)对象到单个对象名下。例如,某个列表中可能是若干向量、矩阵、数据框,甚至其他列表的组合。用户可以使用函数list()创建列表:

Mylist <- list(object1, object2, …)

以下为创建列表的一个示例:

> a  <-  "list example"
> x  <-  c(1,2,3,4,5)
> matrix   <- matrix(1:20, nrow=5, byrow=FALSE)
> k  <- c("one", "two", "four")
> mylist   <- list(a, x, matrix, k)
> mylist
[[1]]
[1] "list example"

[[2]]
[1] 1 2 3 4 5

[[3]]
     [,1] [,2] [,3] [,4]
[1,]    1    6   11   16
[2,]    2    7   12   17
[3,]    3    8   13   18
[4,]    4    9   14   19
[5,]    5   10   15   20

[[4]]
[1] "one"  "two"  "four"

本例创建了一个列表,其中有 4 个成分:1个字符串、1个数值型向量、1个矩阵以及1个字符型向量。用户可以组合任意多的对象,并将它们保存为一个列表。

用户也可以通过在双重方括号中指明代表某个成分的数字或名称来访问列表中的元素。

> mylist[[3]]
     [,1] [,2] [,3] [,4]
[1,]    1    6   11   16
[2,]    2    7   12   17
[3,]    3    8   13   18
[4,]    4    9   14   19
[5,]    5   10   15   20

在此例中,mylist[[3]]指矩阵。由于两个原因,列表成为了R中的重要数据结构。首先,列表允许以一种简单的方式组织和重新调用不相干的信息。其次,许多R函数的运行结果都是以列表的形式返回的,由分析人员决定需要取出其中哪些成分。

R运算符是一些符号,它们要求作比较,进行算术运算、比较运算或逻辑运算等。

1.算术算符

指数学运算中常用的5种运算符号。算术算符的表示方法及其含义如表2-1所示。

表2-1 算术算符

算 术 算 符

算 符 含 义

^

乘幂

*

/

+

-

%%

模运算

%/%

整数除法

2.比较算符

建立两个量之间的一种关系,并要求R确定这种关系是否成立。如果成立,输出的运算结果是1;如果不成立,运算结果为0。比较算符的表示方法及其含义如表2-2所示。

表2-2 比较算符

比 较 算 符

算 符 含 义

==

等于

!=

不等于

>

大于

<

小于

>=

大于等于

<=

小于等于

如表达式X<Y。如果X为5,Y为2,那么表达式X<Y的值为0(不成立)。如果X为5,Y为9,那么X<Y的值为1(成立)。

3.逻辑算符

通常用来连接一系列比较式。逻辑算符包括:& AND(与)、|OR(或)和!NOT(非)。逻辑算符的表示方法及其含义如表2-3所示。

表2-3 逻辑算符

逻 辑 算 符

算 符 含 义

&&

标量的逻辑“与”运算

||

标量的逻辑“或”运算

&

向量的逻辑“与”运算

|

向量的逻辑“或”运算

逻辑非

如果“&”左右两个量都为真,那么AND运算产生的结果为1,否则为0。例如表达式:X<Y and C>0为真,仅当X<Y为真且C>0为真时,也就是当X<Y且C>0为真时,结果为1。

如果“|”两边的量至少有一个为真,那么“|”运算的结果是1,否则是0。例如,表达式X<Y | C>0为真,仅当X<Y为真而不必管C的值,或者C>0为真而不管X<Y是否为真,也就是说,这两个关系式中有一个或两个都成立时,这个表达式为真。

“!”也是一个逻辑算符。在一个值为0的量前面放上“!”的结果是1。也就是否定一个假的结果为真。例如,如果A=B为假,那么!(A=B)为真。在一个缺失值的量前面放上“!”结果也为真。相反,否定一个真的结果就是假的。

R语言表面上没有标量的类型,因为标量可以看作是含有一个元素的向量,但如表2-3所示,逻辑运算符对标量和向量有着不同的形式。下面以一个简单的例子阐述这种区别的必要性。

> x <- c(TRUE, FALSE, TRUE)
> y <-c (TRUE,TRUE,FALSE)
> x & y
[1]  TRUE FALSE FALSE
> x[1 ]&& y[1]
[1] TRUE
> x && y
[1] TRUE
> if ( x[1 ]&& y[1])
+ print("both TURE")
[1] "both TURE"
> if ( x & y)
+  print("both TURE")
[1] "both TURE"
Warning message:

if (x & y) print("both TURE"):条件的长度大于一,因此只能用其第一元素。

if结构条件判断语句的取值,只能是一个逻辑值,而不是逻辑值的向量,这也是为什么会出现警告提示。因此,“&”和“&&”这两种运算符的存在是必要的。


重点提示: 

逻辑值TRUE和FALSE可以缩写为T和F(必须大写),而在算术表达式中它们会转换为1和0。


> 1<2
[1] TRUE
> (1<2) * (3<4)
[1] 1
>  (1<2) * (3<4) * (5<1)
[1] 0
>  (1<2) * (3<4) * (5<1)  * (5<1)
[1] 0
> (3<4)==TRUE
[1] TRUE
> (3<4)==1
[1] TRUE

4.运算次序

下面给出复杂表达式运算次序的准则。

(1)括号里的表达式先计算。

(2)较高优先级的运算先被执行。优先级的顺序如表2-4所示。

(3)对于相同优先级的算符,先做左边的运算。

表2-4 R中各种算符的优先顺序

算 符 级 别 运 算 算 符 算 符 含 义
第1级
(最高级)
^ 乘幂
+ 仅作为前缀时(取正)
仅作为前缀时(取负)
第2级 *
/
第3级 + 仅作为中缀时(加)
仅作为中缀时(减)
第4级 <,<=,>,>=,==,!=
第5级 &,&&,|,||

R函数是一个子程序,它由0个或几个自变量返回一个结果值。每个R函数都有一个关键名字。为了引用函数,要写出它的名字,然后写出一个自变量或几个自变量,并用括号括起来,这个函数对这些自变量进行某种运算。R函数的形式为:

Functionname (variable1,variable2 ┉)

例如SUM(math,English,Chinese),SUM函数计算变量math、English和Chinese的和。又如MIN(X,Y),MIN函数比较两个自变量的值并返回这两个值的最小值。

本节我们将综述R中作为数据处理基石的函数,它们可分为数值(数学、统计、概率)函数和字符处理函数。

以下为常用的数学函数和简短的用例。

> abs(-4)
[1] 4
> sqrt(25) 
[1] 5
> 25^(0.5)
[1] 5
> ceiling(3.475)
[1] 4
> floor(3.475)
[1] 3
> trunc(5.99)
[1] 5
> round(3.475, digits=2)
[1] 3.48
> signif(3.475, digits=2)
[1] 3.5
> cos(2)
[1] -0.4161468
> sin(2)
[1] 0.9092974
> tan(2)
[1] -2.18504
> acos(-0.416)
[1] 1.999839
> asin(-0.416)
[1] -0.4290422
> atan(-0.416)
[1] -0.3942229
> cosh(2)
[1] 3.762196
> sinh(2)
[1] 3.62686
> tanh(2)
[1] 0.9640276
> acosh(2.0)
[1] 1.316958
> asinh(3.627)
[1] 2.000037
> atanh(0.22)
[1] 0.2236561
> log(8,2)
[1] 3
> log(10)
[1] 2.302585
> log10(40)
[1] 1.60206
> log(40,10)
[1] 1.60206
> exp(2)
[1] 7.389056

对数据做变换是这些函数的一个主要用途。数学函数也被用作公式中的一部分,用于绘图函数和在输出结果之前对数值做格式化。

以下为常用的样本函数和简短的用例。

> mean(c(1,2,3,4))
[1] 2.5
> median(c(1,2,3,4,5))
[1] 3
> sd(c(1,2,3,4,5,6,7))
[1] 2.160247
> var(c(1,2,3,4,5,6,7))
[1] 4.666667
> mad(c(1,2,3,4,5,6,7))
[1] 2.9652

求向量x的第25和第75百分位数:

> quantile(c(1,2,3,4,5,6,7),c(.25,.75))
25% 75% 
2.5 5.5
> range(c(1,2,3,4,5,6,7))
[1] 1 7
> diff(range(c(1,2,3,4,5,6,7)))
[1] 6
> sum(c(1,2,3,4,5,6,7))
[1] 28
> x<- c(1, 5, 23, 29)
> diff(x)
[1]  4 18  6
> min(c(1,2,3,4,5,6,7))
[1] 1
> max(c(1,2,3,4,5,6,7))
[1] 7

默认情况下,函数scale()对矩阵或数据框的指定列进行均值为0、标准差为1的标准化:

mydata  <- scale (mydata)

要对每一列进行任意均值和标准差的标准化,可以使用如下代码:

mydata  <- scale (mydata)*SD + M

其中,M是想要的均值,SD为想要的标准差。

以下代码演示了计算某个数值向量的均值和标准差的两种方式,有助于理解统计函数。

> x <- c(1,2,3,4,5,6,7,8,9,15,12)
> mean(x)
[1] 6.545455
> sd(x)
[1] 4.274661
> n<- length(x)
> meanx <- sum(x)/n
> css <- sum((x-meanx)^2)
> sdx <- sqrt(css/(n-1))
> meanx
[1] 6.545455
> sdx
[1] 4.274661

概率函数通常用来生成特征已知的模拟数据,以及在用户编写的统计函数中计算概率值。

在R中,概率函数形如:

 [dpqr]distribution_abbrevation()

其中第一个字母表示其所指分布的某一方面。

常用的概率函数和缩写如下。

我们以正态分布函数为例,了解这些函数的使用方法。如果不指定一个均值和标准差,则函数将假定其为标准正态分布(均值为0,标准差为1)。标准正态分布概率密度函数如图2-1所示。

▲图2-1 标准正态分布概率密度函数

>  x <- pretty(c(-3,3), 30)
>  y <-dnorm(x)
plot(x, y,
type="l",
xlab="NormalDeviate",
ylab="Density",
yaxs="i"
)

位于z=1.96左侧的标准正态曲线下方面积是多少?

> pnorm(1.96)
[1] 0.9750021

标准正态分布的0.975分位点值为多少?

> qnorm(.975)
[1] 1.959964

均值为500,标准差为100的正态分布的0.9分位点值为多少?

> qnorm(.9, mean=500, sd=100)
[1] 628.1552

生成50个均值为50,标准差为10的正态随机数。

> rnorm(50, mean=50, sd=10)
 [1] 57.86568 65.15495 47.67627 57.58522 51.54444 59.29841 60.00383 67.83573
 [9] 51.72464 60.84461 30.48510 30.39757 46.26959 51.60296 45.61807 49.22042
[17] 60.76764 40.72064 53.75776 58.18664 56.91128 40.66373 45.59667 49.54243
[25] 54.24555 45.09342 42.04018 49.76482 52.20662 29.72038 50.26902 34.14525
[33] 47.51494 37.97045 42.22522 46.45015 56.12777 45.11604 53.29744 53.34638
[41] 51.84571 68.33274 38.24069 47.35651 56.88580 43.39235 47.03165 55.79904
[49] 51.18197 40.79011

数学和统计函数是用来处理数值型数据的,而字符处理函数可以从文本型数据中抽取信息,或者为打印输出和生成报告重设文本的格式。一些常用的字符处理函数如下所示。

> x <- c("ab", "cde", "dsdesd")
> length(x)
[1] 3
> nchar(x[3])
[1] 6
> x <- "abcdefghij"
> substr(x, 2, 4)
[1] "bcd"
> substr(x, 2, 4) <- "22222"
> x
[1] "a222efghij"
> grep("A",c("b","A","c"),fixed=TRUE)
[1] 2
> grep("A",c("b","A","c"),fixed=FALSE)
[1] 2
> sub("\\s",".","Hello There")
[1] "Hello.There"

注意,“\s”是一个用来查找空白的正则表达式,使用“\s”而不用“\”的原因在于后者是R中的转义字符。

> y <- strsplit("abc", "")
> y
[[1]]
[1] "a" "b" "c"
> unlist(y)[2]
[1] "b"
unlist(y)[2]
> sapply(y, "[", 2)
[1] "b"
> strsplit("6-16-2011", split="-")
[[1]]
[1] "6"    "16"   "2011"
> paste("x", 1:3,sep="")
[1] "x1" "x2" "x3"
> paste("x",1:3,sep="M")
[1] "xM1" "xM2" "xM3"
> paste("Today is", date())
[1] "Today is Thu Oct 22 04:58:54 2015"
> paste ("North", "Pole")
[1] "North Pole"
> paste ("North", "Pole", sep="")
[1] "NorthPole"
> paste ("North", "Pole", sep=".")
[1] "North.Pole"
> paste ("North", "and", "Pole", "South")
[1] "North and Pole South"
> toupper("abc")
[1] "ABC"
> tolower("DEF")
[1] "def"
> regexpr("uat","Equator")
[1] 3
> gregexpr("iss","Missppiissist")
[[1]]
[1] 2 8

以下函数对于数据管理和处理同样非常实用。

> x <- c(1,2,3,4,5,6)
> length(x)
[1] 6
> mysequ  <- seq(1, 20, 3)
> mysequ
[1]  1  4  7 10 13 16 19
> rep("ABC",3)
[1] "ABC" "ABC" "ABC"
> rep(1:3,3)
[1] 1 2 3 1 2 3 1 2 3
> x  <- c(1:100)
> cut(x, 5)
  [1] (0.901,20.8] (0.901,20.8] (0.901,20.8] (0.901,20.8] (0.901,20.8]
  [6] (0.901,20.8] (0.901,20.8] (0.901,20.8] (0.901,20.8] (0.901,20.8]
 [11] (0.901,20.8] (0.901,20.8] (0.901,20.8] (0.901,20.8] (0.901,20.8]
 [16] (0.901,20.8] (0.901,20.8] (0.901,20.8] (0.901,20.8] (0.901,20.8]
 [21] (20.8,40.6]  (20.8,40.6]  (20.8,40.6]  (20.8,40.6]  (20.8,40.6] 
 [26] (20.8,40.6]  (20.8,40.6]  (20.8,40.6]  (20.8,40.6]  (20.8,40.6] 
 [31] (20.8,40.6]  (20.8,40.6]  (20.8,40.6]  (20.8,40.6]  (20.8,40.6] 
 [36] (20.8,40.6]  (20.8,40.6]  (20.8,40.6]  (20.8,40.6]  (20.8,40.6] 
 [41] (40.6,60.4]  (40.6,60.4]  (40.6,60.4]  (40.6,60.4]  (40.6,60.4] 
 [46] (40.6,60.4]  (40.6,60.4]  (40.6,60.4]  (40.6,60.4]  (40.6,60.4] 
 [51] (40.6,60.4]  (40.6,60.4]  (40.6,60.4]  (40.6,60.4]  (40.6,60.4] 
 [56] (40.6,60.4]  (40.6,60.4]  (40.6,60.4]  (40.6,60.4]  (40.6,60.4] 
 [61] (60.4,80.2]  (60.4,80.2]  (60.4,80.2]  (60.4,80.2]  (60.4,80.2] 
 [66] (60.4,80.2]  (60.4,80.2]  (60.4,80.2]  (60.4,80.2]  (60.4,80.2] 
 [71] (60.4,80.2]  (60.4,80.2]  (60.4,80.2]  (60.4,80.2]  (60.4,80.2] 
 [76] (60.4,80.2]  (60.4,80.2]  (60.4,80.2]  (60.4,80.2]  (60.4,80.2] 
 [81] (80.2,100]   (80.2,100]   (80.2,100]   (80.2,100]   (80.2,100]  
 [86] (80.2,100]   (80.2,100]   (80.2,100]   (80.2,100]   (80.2,100]  
 [91] (80.2,100]   (80.2,100]   (80.2,100]   (80.2,100]   (80.2,100]  
 [96] (80.2,100]   (80.2,100]   (80.2,100]   (80.2,100]   (80.2,100]  
Levels: (0.901,20.8) (20.8,40.6) (40.6,60.4) (60.4,80.2) (80.2,100)


重点提示: 

R函数在许多数值计算及字符和数值数据处理方面,为简化程序编写过程尤其有用。我们应了解各种函数的功用,掌握一些常见函数的应用,并在R语句中应用这些函数。


在数据分析过程中通常会面对来自多种数据源和数据格式的数据,需要将这些数据导入而进行数据分析,并汇报分析结果。R提供了适用范围广泛的数据导入工具。R可从键盘、文本文件、Microsoft Excel和Access、流行的统计软件、特殊格式的文件,以及多种关系型数据库中导入数据。本节将介绍各种数据源的导入方法。

输入数据最直接的方式就是使用键盘输入。R中的函数edit()会自动调用一个允许手动输入数据的文本编辑器,具体步骤如下。

(1)创建一个空数据框(或矩阵),其中变量名和变量类型需与预期中的最终数据集一致。

(2)针对这个数据对象调用文本编辑器,输入数据,并将结果保存回此数据对象中。

如下例所示:

> newdata  <-data.frame(age=numeric(0), sex=character(0), weight=numeric(0))
> newdata <-edit(newdata)

创建一个名为newdata的数据框,它含有3个变量:age(数值型)、sex(字符型)和weight(数值型)。然后调用文本编辑器,键入数据,最后保存结果。

在Windows上调用函数edit()的结果如图2-2所示。

▲图2-2 通过编辑器输入数据


重点提示: 

编辑的结果需要赋值回对象本身。函数edit()事实上是在对象的一个副本上进行操作的。如果不将其赋值到一个目标,所有修改将会全部丢失。


单击列的标题,就可以用编辑器修改变量名和变量类型(数值型、字符型)。你还可以通过单击未使用列的标题来添加新的变量。编辑器关闭后,结果会保存到之前赋值的对象中。再次调用newdata <−edit(newdata),就能够编辑已经输入的数据并添加新的数据。语句newdata <− edit(newdata)的一种简洁的等价写法是fix(newdata)。

这种输入数据的方式对于小数据集很有效。对于较大的数据集,这种方式的局限性就很明显了,可以考虑从现有的文本文件、Excel电子表格、统计软件或数据库中导入数据。

1.从带分隔符的文本文件导入数据

可以使用read.table()从带分隔符的文本文件中导入数据。此函数可读入一个表格格式的文件并将其保存为一个数据框。其语法如下:

 mydata  <- read.table (file, header=TRUE, sep="delimiter", row.names="name")

其中,file是一个带分隔符的ASCII文本文件;header是一个表明首行是否包含了变量名的逻辑值(TRUE或FALSE);sep用来指定分隔数据的分隔符;row.names是一个可选参数,用以指定一个或多个表示行标识符的变量。

如下所示:

> Example2_1  <- read.table ("example2_1.csv", header=TRUE, sep=",")
> Example2_1 
   group   atp
1      1  7.76
2      2 11.14
3      3 10.85
4      1  7.71
5      2 11.60
6      3  8.58
7      1  8.43
8      2 11.42
9      3  7.19
10     1  8.47
11     2 13.85
12     3  9.36
13     1 10.30
14     2 13.53
15     3  9.59
16     1  6.67
17     2 14.16
18     3  8.81
19     1 11.73
20     2  6.94
21     3  8.22
22     1  5.78
23     2 13.01
24     3  9.95
25     1  6.61
26     2 14.18
27     3 11.26
28     1  6.97
29     2 17.72
30     3  8.68

从当前工作目录中读入了一个名为example2_1.csv的逗号分隔文件,从文件的第一行取得了各变量名称,最后将结果保存到了名为Example2_1的数据框中。


注意: 

参数sep允许导入那些使用逗号以外的符号来分隔行内数据的文件。可以使用sep="\t"读取以制表符分隔的文件。此参数的默认值为sep="",即表示分隔符可为一个或多个空格、制表符、换行符或回车符。


默认情况下,字符型变量将转换为因子。但是有许多方法可以禁止这种转换行为,其中包括设置选项stringsAsFactors=FALSE,这将停止对所有字符型变量的此种转换。还有一种方法是使用选项colClasses为每一列指定一个类,例如logical(逻辑型)、numeric(数值型)、character(字符型)、factor(因子)。

2.导入Excel数据

读取一个Excel文件的最好方式就是在Excel中将其导出为一个逗号分隔文件(csv),并使用前文描述的方式将其导入R中。在Windows系统中,也可以使用RODBC包来访问Excel文件。电子表格的第一行应当包含变量/列的名称。

首先,下载并安装RODBC包:

> install.packages("RODBC")

然后使用以下代码导入数据:

> library(RODBC)
> Example2_2  <- odbcConnectExcel("example2_2.xls")
> mydata <- sqlFetch(Example2_2, "sheet1")
> odbcClose (Example2_2)

这里的example2_2.xls是一个Excel文件,sheet1是要从这个工作簿中读取工作表的名称,channel是一个由odbcConnectExcel()返回的RODBC连接对象,mydata是返回的数据框。

3.导入SPSS数据

SPSS数据集既可以通过foreign包中的函数read.spss()导入R中,也可以使用Hmisc包中的spss.get()函数。函数spss.get()是对函数read.spss()的一个封装,它可以自动设置后者的许多参数,让整个转换过程更加简单一致,最后得到数据分析人员所期望的结果。

首先,下载并安装Hmisc包(foreign包已被默认安装):

> install.packages("Hmisc")

然后使用以下代码导入数据:

> library(Hmisc)
> mydata  <- spss.get("mydata.sav", use.value.labels=TRUE)

在以上代码中,mydata.sav是要导入的SPSS数据文件,use.value.labels=TRUE让函数将带有值标签的变量导入为R中水平对应相同的因子,mydata是导入后的数据框。

4.导入SAS数据

R中有几个用来导入SAS数据集的函数,包括foreign包中的函数read.ssd()和Hmisc包中的函数sas.get()。但是,对于较新版本SAS(SAS 9.1或更高版本),这些函数并不能正常工作,因为R尚未跟进SAS对文件结构的改动。用户可以在SAS中使用PROC EXPORT将SAS数据集保存为一个逗号分隔的文本文件,然后将带分隔符的文本文件导入R中。

另外,Stat/Transfer软件可以完好地将SAS数据集(包括任何已知的变量格式)保存为R数据框。

5.导入Stata数据

要将Stata数据导入R中非常简单直接,所需代码如下:

Library(foreign)
Mydata  <- read.dta("mydata.dta")

其中,mydata.dta是Stata数据集,mydata是返回的R数据框。


重点提示: 

进行分析之前,必须首先建立R数据集。应学会用多种方法创建R数据集,并进行浏览和编辑。通过本节的学习,应熟练掌握数据集的建立、保存、导入方法等。在计算机上反复操作本节的实例,可以达到熟练使用R数据集的各种编辑方法的效果。精通R数据集,对于读者学习R可以起到事半功倍的效果。


掌握数据集基本概念和操作方法是学习R的关键环节。在R中,把大部分常用的复杂数据计算的算法作为函数调用,用户仅需要指出函数名及其必要的参数即可。这一特点使得R编程十分简单。R语言也有它自己的语言和句法,关键词和连接关键词与其他辅助信息的规则,用户可使用R语言来定义数据和规定对数据怎样做统计分析。我们需要掌握R语言的构成部分,并会编写简单的R程序。本章介绍了R函数的含义、各种运算算符的用法以及运算次序。


相关图书

R语言编程:基于tidyverse
R语言编程:基于tidyverse
R语言医学多元统计分析
R语言医学多元统计分析
Python与R语言数据科学实践
Python与R语言数据科学实践
R数据挖掘实战
R数据挖掘实战
R语言机器学习实战
R语言机器学习实战
R语言高效能实战:更多数据和更快速度
R语言高效能实战:更多数据和更快速度

相关文章

相关课程