R语言与大数据编程实战.pdf
http://www.100md.com
2020年2月4日
![]() |
| 第1页 |
![]() |
| 第5页 |
![]() |
| 第13页 |
![]() |
| 第30页 |
![]() |
| 第45页 |
![]() |
| 第119页 |
参见附件(7604KB,321页)。
R语言与大数据编程实战是关于R语言的入门书籍,主要讲述了R语言在大数据中的应用,原始数据的探索与预处理,R的数据可视化,R中的方差分析,R中的广义线性回归模型等等内容。

R语言与大数据编程实战内容
本书是一本R语言入门读物,它旨在帮助读者迅速构建起与数据分析相关的知识体系,并学习如何使用R软件实现数据分析方法。无论有无编程基础或数学基础,本书都能帮助读者成长为一名合格的数据分析师。本书全面介绍了来自统计分析、机器学习、人工智能等领域的多种数据分析算法,在讲解与之相关的R代码时,还讨论了这些算法的原理、优缺点与适用背景。本书按照由易到难的原则组织章节主题,读者将获得最好的阅读体验。通过阅读本书,读者将对R语言在数据分析领域的应用有一个全面的认识。这种认识不被特定行业所局限,任何行业的读者都能利用本书介绍的数据分析方法解决本行业的数据分析问题。
作者信息
李倩星:毕业于西南大学统计学专业,对数据挖掘、机器学习以及人工智能领域有深刻的研究。主持翻译了《传播学中的大数据:发展与不足》、《大数据、一个新兴领域的误区和方法与概念》、《数据挖掘揭示了差评导致的负反馈怪圈》等数十篇前沿科技文章,并发表于PPV课社区。
目录
第1章?R的基本介绍1
1.1?强大的R1
1.2?R语言在大数据中的应用2
1.2.1?R语言用户行为分析2
1.2.2?R语言处理金融大数据3
1.2.3?R语言天气数据可视化4
1.2.4?R语言医疗大数据分析4
1.3?R的安装与启动5
1.3.1?安装并启动R6
1.3.2?安装并启动一个IDE7
1.4?R的向量、矩阵和数组8
1.4.1?向量的操作方法和固有属性8
1.4.2?矩阵的操作和运算10
1.4.3?数组中的维度函数13
1.5?R的列表和数据框14
1.5.1?列表的特性和编辑方法14
1.5.2?数据框的创建和基本操作17
1.6?R数据文件的载入和载出19
1.6.1?结构化纯文本文件的读取和输出19
1.6.2?其他文件的读取和输出22
1.7?向R中安装包23
第2章?原始数据的探索与预处理26
2.1?度量数据集的集中程度26
2.2?度量数据集的分散程度27
2.2.1?极值、方差和标准差27
2.2.2?标准误和偏度系数、峰度系数29
2.3?创建一个数值摘要表30
2.4?异常值的观测与说明32
2.4.1?利用箱线图观测异常值并处理32
2.4.2?异常值检测的其他情况和说明34
2.5?缺失值的填补与处理35
2.5.1?删除缺失值或对其进行简单填补36
2.5.2?按照相关性对空缺值进行填补38
第3章?R的数据可视化40
3.1?plot()函数和常用的图形参数40
3.1.1?设置plot()函数中的参数40
3.1.2?修改散点图的坐标并加入标注43
3.2?经典的基础图形及用途45
3.2.1?线图45
3.2.2?直方图49
3.2.3?箱线图和茎叶图52
3.3?将图形组合起来55
3 ......
R语言与大数据编程实战
李倩星 编著
高级大数据人才培养丛书
内 容 简 介
本书是一本 R 语言入门读物,它旨在帮助读者迅速构建起与数据分析相关的知识体系,并学习如
何使用 R 软件实现数据分析方法。无论有无深厚的编程基础或数学基础,本书都能帮助读者成长为一
名合格的数据分析师。
本书全面介绍了来自统计分析、机器学习、人工智能等领域的多种数据分析算法,在讲解与之相
关的R代码时,还讨论了这些算法的原理、优缺点与适用背景。本书按照由易到难的原则组织章节主题,读者将获得最好的阅读体验。通过阅读本书,读者将对R语言在数据分析领域的应用有一个全面的认识。
这种认识不被特定行业所局限,任何行业的读者都能利用本书介绍的数据分析方法解决本行业的数据
分析问题。
未经许可,不得以任何方式复制或抄袭本书之部分或全部内容。
版权所有,侵权必究。
图书在版编目(CIP)数据
R 语言与大数据编程实战 李倩星编著. —北京:电子工业出版社,2017.9
(高级大数据人才培养丛书)
ISBN 978-7-121-32634-9
Ⅰ . ① R… Ⅱ. ①李… Ⅲ. ①程序语言-程序设计Ⅳ. ①TP312
中国版本图书馆 CIP 数据核字(2017)第 215708 号
策划编辑:李? 冰
责任编辑:李? 冰
特约编辑:彭? 瑛? 赵海军等
印 刷:三河市华成印务有限公司
装 订:三河市华成印务有限公司
出版发行:电子工业出版社
北京市海淀区万寿路173信箱 邮编:100036
开 本:787×1092 116 印张:20 字数:512千字
版 次:2017年9月第1版
印 次:2017年9月第1次印刷
定 价:59.00元
凡所购买电子工业出版社图书有缺损问题, ?请向购买书店调换。 ?若书店售缺, ?请与本社发行部联
系, ?联系及邮购电话 : ? (010) 88254888, 88258888。
质量投诉请发邮件至zlts@phei.com.cn,盗版侵权举报请发邮件至dbqq@phei.com.cn。
本书咨询联系方式 : ?libing@phei.com.cn。前 言
R 语言是如今最热门的编程语言之一,它由统计学家开发,在解决数据分析问题时
具有先天优势。R语言是一门新兴的语言,掌握它,就是掌握了一门高效的数据分析软件。
随着大数据概念的普及,R 语言能够实现的功能越来越丰富,越来越多的数据分析从业
人员产生了学习 R 语言的需求。本书迎合时代潮流,讲解了大数据时代下 R语言渗透最
广泛的几个领域,全面介绍了如何使用 R 语言完成数据挖掘工作。对 R语言编程人员来
说,本书是一本不可或缺的工具书。
本书特色
1. 通俗易懂、实用性强,适合各层次读者学习
本书对读者的数学基础或编程基础不做任何要求。在讲解知识点时,本书采用了平
实的语言,对每个疑难点都加以详细解释。此外,本书以实用为主旨,秉承“看得懂、学得会、用得上”的编写原则,精心选取了流行于行业前沿的 18 个主题,不仅通俗易懂,还确保读者所学的知识具有实际应用价值。通过阅读本书,读者都能迅速掌握 R 语言的
编程技巧及相关的数据分析知识,并在实际工作中立刻应用它们。
2. 条理清晰、结构巧妙,全面盘点数据分析常用算法
数据分析是一个涉及多领域的交叉学科,R 软件的触角同样也能伸展到多个领域。
本书选取了统计分析、机器学习、人工智能等多个学科的流行算法作为主题,讲解了如
何使用 R 语言实现它们。这些算法有些偏重数学思维,有些偏重编程技巧,本书主要遵
循由易到难的顺序排列主题,并尽量把起源于同一学科的算法放在一起。读者可以按照
顺序阅读本书,也可以优先选择感兴趣的部分。此外,本书还穿插介绍了与 R 软件相关
的一些其他编程主题,这些主题共同形成知识网络,帮助读者迅速成长为能够独当一面
的数据科学家。
3. 知识点丰富、可拓展性强,满足读者的多重需求
本书涉及多个学科,全面介绍了 R 软件能够实现的多种算法,满足了读者的三大需
求:首先,使用通俗易懂的语言介绍 R 软件,帮助读者实现零基础入门;其次,囊括多
种数据分析算法,带领读者全面认识 R 软件的强大之处,帮助读者成长为合格的数据科
学家;最后,本书具备较强的可拓展性,从事任何行业的读者都能够从本书中获取适合
其行业的知识。本书还给出了 R 语言进阶的线索,无论想向哪一方面进阶,本书都能为
读者打造最坚实的基础。
IV
R 语言与大数据编程实战
本书内容及体系结构
本书总共 18 章,分别为R 的基本介绍、原始数据的探索与预处理、R 的数据可视化、R 中参数的估计和检验、R 中的方差分析、R 中的相关分析和回归分析、更高级的数据
可视化、R 中的聚类分析和判别分析、R 中的主成分分析和因子分析、R 中的广义线性
回归模型、R 中的时间序列模型、R 中的最优化问题、使用 R 绘制地理信息图形、使用
R 构建支持向量机、实现更高效的流程控制和高级循环、R 代码的调试与优化、构建电
影评分预测模型、贝叶斯垃圾邮件过滤器模型。这18 章进一步又分为 5 个部分。
第一部分为本书的第1~6 章。其中前 3 章展示了R 软件的一些入门功能,如数据预
处理和数据可视化等,后 3章则介绍了三种基础的统计分析方法,即参数的估计和检验、方差分析、相关分析、回归分析。这6 章围绕初级的统计方法展开,是数据分析师必备
的基本知识。
第二部分为本书的第 7~11 章,这 5 章介绍了更高级的统计方法。其中,第 7 章为
第 3 章的延伸,介绍了数据可视化的高级方法,第 8~11 章则介绍了 6 种高级统计分析
方法,这部分的内容与第一部分互为补充。
第三部分为本书的第 12~14 章,这部分内容围绕机器学习展开。第 12 章的主题为
最优化,是机器学习的基本理论。第 13 章介绍了如何使用矢量化的思想绘制地图。第
14 章则介绍了支持向量机,它是最典型的机器学习算法之一。这部分讲解了更高深的 R
语言编程技巧,讨论了一些R 软件能够解决的高难度问题。
第 15、16 章可视为本书的第四部分。这两章围绕如何优化 R 代码展开,系统地讨
论了如何写出错误较少的、运行速度较快的代码。这部分内容帮助读者建立良好的编程
习惯,以及与其他 R用户更好地协同工作。
第 17、18 章则为本书的最后一部分,这两章分别讨论了一个完整的数据挖掘项目。
其中电影评分预测的案例着重于表现数据挖掘的完整流程,包括繁复的数据预处理与反
复的模型比较等工作;垃圾邮件过滤的案例则引出 R 软件能够处理的另一个主题——文
本分析。
上述划分方法仅为一个参考,本书的 18 章既互相联系又彼此独立,读者可按照上
述划分方法阅读本书,也可优先阅读某些章节,如将第 3、7、13 章等与数据可视化相
关的三个章节放在一起阅读。
本书读者对象
y 想要了解R语言的数据分析从业人员。
y 统计学、金融学、计算机技术与科学等专业的学生。
y 想要提高R语言编程能力的数据分析师。
y 希望系统学习统计分析方法的从业人员。
y 其他对 R 语言有兴趣的各类人员。目 录
第 1章 R的基本介绍 .................................................................................................1
1.1 强大的 R ....................................................................................................................1
1.2 R 语言在大数据中的应用 ........................................................................................2
1.2.1 R 语言用户行为分析 .....................................................................................2
1.2.2 R 语言处理金融大数据 .................................................................................3
1.2.3 R 语言天气数据可视化 .................................................................................4
1.2.4 R 语言医疗大数据分析 .................................................................................4
1.3 R 的安装与启动 ........................................................................................................5
1.3.1 安装并启动 R .................................................................................................6
1.3.2 安装并启动一个 IDE .....................................................................................7
1.4 R 的向量、矩阵和数组 ............................................................................................8
1.4.1 向量的操作方法和固有属性 ........................................................................8
1.4.2 矩阵的操作和运算 ......................................................................................10
1.4.3 数组中的维度函数 ......................................................................................13
1.5 R 的列表和数据框 ..................................................................................................14
1.5.1 列表的特性和编辑方法 ..............................................................................14
1.5.2 数据框的创建和基本操作 ..........................................................................17
1.6 R 数据文件的载入和载出 ......................................................................................19
1.6.1 结构化纯文本文件的读取和输出 ..............................................................19
1.6.2 其他文件的读取和输出 ..............................................................................22
1.7 向 R 中安装包 .........................................................................................................23
第2章 原始数据的探索与预处理 .............................................................................26
2.1 度量数据集的集中程度 ..........................................................................................26
2.2 度量数据集的分散程度 ..........................................................................................27
2.2.1 极值、方差和标准差 ..................................................................................27
2.2.2 标准误和偏度系数、峰度系数 ..................................................................29
VI
R 语言与大数据编程实战
2.3 创建一个数值摘要表 ..............................................................................................30
2.4 异常值的观测与说明 ..............................................................................................32
2.4.1 利用箱线图观测异常值并处理 ..................................................................32
2.4.2 异常值检测的其他情况和说明 ..................................................................34
2.5 缺失值的填补与处理 ..............................................................................................35
2.5.1 删除缺失值或对其进行简单填补 ..............................................................36
2.5.2 按照相关性对空缺值进行填补 ..................................................................38
第3章 R 的数据可视化 ...........................................................................................40
3.1 plot 函数和常用的图形参数 ................................................................................40
3.1.1 设置 plot 函数中的参数 ...........................................................................40
3.1.2 修改散点图的坐标并加入标注 ..................................................................43
3.2 经典的基础图形及用途 ..........................................................................................45
3.2.1 线图 ..............................................................................................................45
3.2.2 直方图 ..........................................................................................................49
3.2.3 箱线图和茎叶图 ..........................................................................................52
3.3 将图形组合起来 ......................................................................................................55
3.4 更多的高水平作图函数 ..........................................................................................57
3.5 更多的常用作图命令 ..............................................................................................59
第4章 R 中参数的估计和检验 .................................................................................62
4.1 使用R进行点估计和区间估计 .............................................................................62
4.1.1 简单的点估计和区间估计 ..........................................................................62
4.1.2 估计单侧置信区间 ......................................................................................65
4.2 与正态总体有关的参数检验 ..................................................................................68
4.3 列联表与独立性检验 ..............................................................................................71
4.4 几种检验数据分布的函数 ......................................................................................72
4.5 对非正态总体的区间估计和检验 ..........................................................................75
4.5.1 非正态总体的区间估计 ..............................................................................75
4.5.2 非参数检验中的符号检验 ..........................................................................76
4.5.3 非参数检验中的秩检验 ..............................................................................78VII
目 录
第 5章 R中的方差分析 ...........................................................................................80
5.1 方差分析模型的建立 ..............................................................................................80
5.2 单因素方差分析 ......................................................................................................81
5.2.1 单因素方差分析的数学思想与模型 ..........................................................81
5.2.2 检验样本是否满足方差分析的假设条件 ..................................................82
5.2.3 构建单因素方差分析模型 ..........................................................................84
5.3 多因素方差分析 ......................................................................................................87
5.3.1 多因素方差分析的数学思想与模型 ..........................................................87
5.3.2 不考虑交互作用的双因素方差分析 ..........................................................88
5.3.3 考虑交互作用的双因素方差分析 ..............................................................89
5.4 秩检验和协方差分析 ..............................................................................................91
5.4.1 对控制变量应用秩检验方法 ......................................................................91
5.4.2 协方差分析的假设与应用 ..........................................................................92
第6章 R中的相关分析和回归分析 .........................................................................94
6.1 多种相关系数的度量和分析 ..................................................................................94
6.1.1 简单相关系数的计算和检验 ......................................................................94
6.1.2 散布矩阵图和偏相关系数 ..........................................................................96
6.1.3 典型相关分析 ..............................................................................................98
6.2 线性回归分析及其常规参数 ..................................................................................99
6.2.1 对数据进行预处理 ....................................................................................100
6.2.2 构建第一个回归模型 ................................................................................101
6.2.3 修正方程并检验残差 ................................................................................102
6.3 使用逐步回归筛选自变量 ....................................................................................104
6.3.1 逐步回归的思想与分类 ............................................................................104
6.3.2 构建逐步回归模型 ....................................................................................105
6.4 哑变量和逻辑回归 ................................................................................................107
6.4.1 哑变量和逻辑回归的思想 ........................................................................107
6.4.2 向线性回归模型中纳入哑变量 ................................................................108
VIII
R 语言与大数据编程实战
第 7章 更高级的数据可视化 .................................................................................. 110
7.1 基础图形的拓展与延伸 ........................................................................................110
7.1.1 绘制分类散点图并添加图标 ....................................................................110
7.1.2 绘制含多种类别的密度分布图 ................................................................112
7.1.3 复合条形图和堆栈条形图 ........................................................................114
7.2 有关多元分布函数的特殊图形 ............................................................................117
7.2.1 星图和脸谱图 ............................................................................................117
7.2.2 轮廓图 ........................................................................................................120
7.2.3 调和曲线图 ................................................................................................122
7.3 建立最简单的3D图形 .........................................................................................123
7.4 如何让图形更美观 ................................................................................................125
7.5 更多的绘图包和系统 ............................................................................................128
第8章 R 中的聚类分析和判别分析 .......................................................................129
8.1 几种聚类分析的异同 ............................................................................................129
8.2 使用R实现KNN 聚类 ........................................................................................130
8.2.1 KNN算法的思想和模型 ...........................................................................130
8.2.2 使用R实现 KNN 聚类 .............................................................................131
8.3 使用 R 实现系统聚类 ...........................................................................................133
8.3.1 系统聚类的思想和模型 ............................................................................133
8.3.2 使用R实现系统聚类 ................................................................................134
8.4 使用 R 实现快速聚类 ...........................................................................................136
8.4.1 快速聚类的思想和模型 ............................................................................136
8.4.2 使用R实现快速聚类 ................................................................................137
8.5 几种判别分析模型综述 ........................................................................................140
8.5.1 距离判别模型 ............................................................................................140
8.5.2 Fisher判别模型 .........................................................................................142
第 9章 R 中的主成分分析和因子分析 ....................................................................145
9.1 主成分分析的实现与应用 ....................................................................................145
9.1.1 主成分分析的模型假设和数据处理 ........................................................145
9.1.2 构造一个主成分分析模型 ........................................................................147IX
9.1.3 计算主成分的综合得分 ............................................................................149
9.2 因子分析的初次构建与完善 ................................................................................150
9.2.1 构造一个简单的因子分析模型 ................................................................150
9.2.2 计算因子得分并分析 ................................................................................152
9.3 对因子分析模型进行修正 ....................................................................................153
9.3.1 修改因子分析模型中的因子个数 ............................................................153
9.3.2 基于主成分法和主轴因子法进行因子分析 ............................................155
9.4 在降维分析的基础上进行回归分析和聚类分析 ................................................157
9.4.1 在降维分析的基础上进行回归分析 ........................................................157
9.4.2 在降维分析的基础上进行聚类分析 ........................................................160
第10章 R 中的广义线性回归模型 ........................................................................162
10.1 一般的广义线性回归模型 ..................................................................................162
10.1.1 使用二次函数拟合线性回归模型 ..........................................................162
10.1.2 拟合更多的广义线性模型 ......................................................................164
10.1.3 比较线性模型的优劣 ..............................................................................166
10.2 Logistic线性回归模型 ........................................................................................168
10.2.1 Logistic模型的原理与构建方法 ............................................................168
10.2.2 Logistic模型的显著性检验和优势比 ....................................................170
10.2.3 修正被警告的 Logistic模型 ...................................................................171
10.3 泊松回归分析模型 ..............................................................................................173
10.3.1 拟合第一个泊松回归模型 ......................................................................174
10.3.2 泊松回归模型的过散布检验 ..................................................................176
10.4 广义线性模型的交叉验证 ..................................................................................178
第 11章 R中的时间序列模型 ...............................................................................180
11.1 将数据转换为时间序列格式 ..............................................................................180
11.1.1 使用ts 函数转换数据格式并绘制时间序列曲线 ...............................180
11.1.2 使用zoo 函数转换数据格式并绘制时间序列曲线 ............................182
11.2 分解时间序列并检验时间序列的自相关性 ......................................................185
11.2.1 使用经典方法分解时间序列 ..................................................................185
11.2.2 使用STL 方法分解时间序列 .................................................................186
目 录
X
R 语言与大数据编程实战
11.3 探究时间序列的自相关性 ..................................................................................188
11.3.1 使用月图和季度图探究自相关性 ..........................................................188
11.3.2 使用散点图探究自相关性 ......................................................................189
11.4 构建时间序列并预测 ..........................................................................................191
11.4.1 均值预测、单纯预测和漂移 ..................................................................192
11.4.2 不考虑长期趋势和季节波动的简单指数平滑 ......................................195
11.4.3 在指数平滑中加入长期趋势和季节波动 ..............................................196
11.4.4 自回归移动平均模型 ..............................................................................198
第12章 R中的最优化问题 ..................................................................................201
12.1 最优化问题简述 ..................................................................................................201
12.2 黄金分割法 ..........................................................................................................202
12.2.1 黄金分割法和局部最优解 ......................................................................202
12.2.2 使用 R实现黄金分割法 ..........................................................................203
12.3 牛顿最优化方法 ..................................................................................................205
12.3.1 牛顿法的算法原理 ..................................................................................206
12.3.2 在一维情形下实现牛顿迭代法 ..............................................................207
12.3.3 在多维情形下实现牛顿迭代法 ..............................................................209
12.4 最快上升法 ..........................................................................................................210
12.4.1 利用梯度求解上升最快的相邻点 ..........................................................210
12.4.2 构建最快上升法函数并检验 ..................................................................212
12.5 R中的最优化函数 ..............................................................................................213
第13章 使用 R绘制地理信息图形 .......................................................................216
13.1 绘制世界、国家、省市地图 ..............................................................................216
13.1.1 使用 map 函数绘制地图 .......................................................................216
13.1.2 另一种绘制地图的方法 ..........................................................................217
13.1.3 分省市绘制地图 ......................................................................................218
13.2 向地图中添加颜色 ..............................................................................................220
13.2.1 向地图中添加颜色前的准备工作 ..........................................................220
13.2.2 在地图上添加颜色 ..................................................................................221
13.3 向地图中添加标签和线条 ..................................................................................222
13.3.1 向地图中添加标签前的准备工作 ..........................................................222XI
13.3.2 在地图上添加标签 ..................................................................................224
13.3.3 在地图上添加线条 ..................................................................................225
13.4 使用其他格式的文件优化地图 ..........................................................................226
第14章 使用 R 构建支持向量机 ..........................................................................230
14.1 构建一个简单的支持向量机 ..............................................................................230
14.1.1 支持向量机的算法原理 ..........................................................................230
14.1.2 构建一个简单的支持向量机 ..................................................................232
14.1.3 使用其他核函数构建支持向量机 ..........................................................235
14.2 优化支持向量机的参数 ......................................................................................237
14.2.1 优化参数degree .......................................................................................238
14.2.2 优化参数cost ...........................................................................................241
14.2.3 优化参数gamma .....................................................................................243
14.3 比较支持向量机与 Logistic回归的优劣 ...........................................................246
14.4 比较支持向量机和 KNN 聚类算法的优劣 .......................................................249
第 15章 实现更高效的流程控制和高级循环 .........................................................251
15.1 R 中的流程控制 ..................................................................................................251
15.1.1 if 语句的多种实现方法 ...........................................................................251
15.1.2 ifelse 语句与花括号的结合 .....................................................................252
15.1.3 适合多分支情况的 switch 语句 ..............................................................254
15.2 R 中的for 循环、while 循环和 repeat循环 ......................................................256
15.2.1 R 中的 for 循环和 while循环 .................................................................256
15.2.2 R 中的 repeat循环 ...................................................................................258
15.3 apply 家族中的循环函数 ....................................................................................260
15.3.1 R 中的 apply 函数 .................................................................................260
15.3.2 R 中的 lapply 函数和sapply函数 .....................................................263
15.3.3 R 中的 tapply 函数 ................................................................................265
15.3.4 R 中的 mapply 函数 ..............................................................................268
15.4 更多的高级循环函数 ..........................................................................................270
15.4.1 R 中的 replicate函数和sweep函数..................................................270
15.4.2 R 中的 aggregate函数 ..........................................................................273
目 录
XII
R 语言与大数据编程实战
第 16章 R代码的调试与优化 ...............................................................................276
16.1 R 代码的常见信息与警告 ..................................................................................276
16.1.1 R 代码的正常信息与警告 .......................................................................276
16.1.2 R代码中的警告处理方法 .......................................................................278
16.2 R代码中的错误与错误处理方法 ......................................................................279
16.2.1 使用 try 函数处理错误信息 .................................................................279
16.2.2 将 try函数与循环相结合 .....................................................................281
16.3 调试 R代码 .........................................................................................................282
16.3.1 查看调用栈或暂停代码 ..........................................................................282
16.3.2 修改 error选项 ........................................................................................284
16.4 向量化编程方法 ..................................................................................................285
16.4.1 向量化编程思想 ......................................................................................285
16.4.2 比较循环和向量的运行速度 ..................................................................286
第17章 构建电影评分预测模型 ...........................................................................289
17.1 获取数据并探索 ..................................................................................................289
17.2 利用 recommenderlab包处理数据 .....................................................................291
17.3 建立模型并评估 ..................................................................................................293
17.3.1 模型的选择与建立 ..................................................................................293
17.3.2 模型之间的比较和评估 ..........................................................................295
第18章 贝叶斯垃圾邮件过滤器模型 ....................................................................297
18.1 贝叶斯模型中的条件概率 ..................................................................................297
18.2 复杂的数据预处理过程 ......................................................................................298
18.2.1 利用 for 循环读入多封邮件正文 ............................................................298
18.2.2 利用 tm 包进一步转换数据格式 ............................................................300
18.2.3 将 TDM转换成真正有用的数据框 .......................................................301
18.3 利用 occurrece值构造分类器 ............................................................................303
18.3.1 完成理论准备并处理测试邮件和普通邮件 ..........................................303
18.3.2 创建一个函数用于比较概率 ..................................................................305第 1章 R的基本介绍
作为一门新兴的编程语言,R 是如今值得学习的语言。由统计学家开发出的 R 语言
具有许多奇特性质,本章将较为全面地介绍 R 的特性和用途,并讲解 R 的安装方法、变
量类型、从其他数据源读取数据、程序包等基本知识。本章帮助读者对 R 形成整体印象,同时本章内容也是后续章节的基石。
1.1 强大的 R
R语言脱胎于 S 语言,是一门专门用于处理数据探索、统计分析等任务的编程语言。
它由统计学家开发完成,在数据分析方面具有天然的优势,运行 R 程序的 R软件是如今
最流行的统计软件之一。
与其他统计软件相比,R 软件最特别的地方在于它是开源的。这同时意味着:第一,R 是免费的;第二,R 的用户能够自由地参与到 R 的开发中。R 社区将它的忠实用户聚
合在一起,这些用户主要由统计学家、计算机学家、数据分析师等组成,不同领域的用
户在 R社区中交流碰撞,协助 R 核心团队丰富和完善R 的功能。
R 的用户之间具有非常紧密的联系,他们最大的贡献是创建了形形色色的程序包,这些程序包分别封装了一些具有特定作用的函数。如今,R软件已经内置了非常丰富的
各类函数库,能够满足绝大多数统计人员的各类需求,它的制图功能也远超其他统计软件。
R 的另一个特点在于它支持混合型的编程范式。R 是一种解释型的语言,当用户在
R 软件中编写好一条代码后,R 会立即执行它。这种做法的好处在于用户可以即时地看
到程序的返回结果,在作图时尤其方便。R 是一种面向对象的语言,同时它也支持函数
式编程,即用户可以在 R 中调用现成的或自己编写的函数,这一点与 C 语言较为相似,但 R要比 C语言更加灵活。
尽管 R 的优点很突出,但它也同样具有局限之处。首先,R 语言的编程原理较为
传统,在处理数据时,R 需要将数据全部载入内存,这一点极大地影响了 R 的运行效
率,尽管如今的计算机内存做得越来越大,但在有些大规模数据集的处理工作中,R 还
是会显得不够得力。其次,R 软件的保密性不如 SAS 等统计软件好,这限制了 R 在大
型商业项目中的应用。最后,由于 R 软件是由统计学家开发的,因此其语法设计并不特
别严谨,有时它会出现一些奇怪的错误。
随着大数据时代的到来,R语言正被越来越多的人关注,不仅是统计分析和数据挖掘,一些研究机器学习和模式识别的专家同样关注到R的发展。根据TIOBE提供的编程语言
排行榜,R语言的流行程度在近几年内已经飙升至前十名,其火爆程度只有Python才能与
其比肩,而同为统计软件的SAS和MATLAB则一直徘徊于二三十名的位置。
2
R 语言与大数据编程实战
R的优点使它广泛地流行于统计人员和中小型商业公司中。Google、百度等互联网
巨头则将 R 语言看作一个沙盘,使用软件验证各种数据模型的可行性,并最终使用其他
语言实现。随着 R 的用户越来越多样化,其可扩展能力进一步强化,能够解决的问题也
越来越丰富。如今,金融、医药、教育、社会科学等每一个需要数据分析的领域都需要
精通 R 的人才。
1.2 R语言在大数据中的应用
R 语言的起源是统计学家为解决数据分析领域问题而开发的语言,所以和
MATLAB、Python 等可用于数据处理的语言相比,在数据分析处理方面具有一些独特优
势,本节将讲述 R语言在大数据领域中的典型应用。
1.2.1? R语言用户行为分析
近几年,淘宝、京东等几家电商的价格战打得不亦乐乎,而从电商发布的战果来看,几败具伤的价格战已经无法保证电商的利润,他们开始转向利用大数据分析工具对用户
行为进行分析,通过对大数据的充分使用和挖掘在商战中获胜。
何为“用户行为分析”?简单的理解就是对用户在网站上发生的所有行为进行分析,找到里面的规律和用户感兴趣的信息。这些行为如搜索商品信息、浏览新闻、购物评价
和打分、美团点评、加入收藏列表、加入购物车、购买、使用特价购物券、换货和退货
等;除此之外,还包括在第三方网站上的相关行为分析,如比价、看相关评测、参与讨论、社交媒体上的交流、与好友互动等。电子商务的突出特点就是可以通过后台收集到大量
客户在购买前的行为信息,而这些信息对于分析用户行为至关重要。
全球电子商务的创始者之一亚马逊公司结合大数据分析工具,以迅雷不及掩耳之势,彻底颠覆了很多行业的市场规则及竞争关系。亚马逊取胜的根本原因在于对数据的战略
性认识和使用,亚马逊通过传统门店无法比拟的互联网手段,获取了极其丰富的用户行
为信息,并且进行深度分析与挖掘。
电商通过对用户行为的分析,可以制定更加贴心的服务。例如,当客户浏览了多款
手机而没有做购买的行为时,系统会把适合客户的品牌、价位和类型的多款手机信息推
送到客户的账户,只要客户登录系统,就可以看到这些推送信息。这样的个性化推荐服
务往往会起到非常好的效果,不仅可以提高客户购买的意愿,缩短购买的路径和时间,还可以在比较恰当的时机捕获客户的最佳购买冲动,提升用户体验,是一个一举多得的
好方式。
在电商领域中,用户的行为信息量之大令人难以想象,据不完全统计,用户在电商
网站购买一个商品前,平均会浏览 3 ~ 5 个网站(淘宝、京东、1 号店等)、30 ~ 36 个
页面,统计起来对于一个一天有近百万访问量的中型电商,一天就会有1TB 左右的活跃
数据。
除了电商,爱奇艺、优酷、土豆网等各类视频网站已成为人们娱乐和学习的重要平台,视频网站成功与否的最重要衡量标准就是用户的满意度。由于Web 应用能够以很细的粒3
第1章 R 的基本介绍
度、很高的频度不断记录用户的行为轨迹,这些数据中隐藏着用户的访问习惯、兴趣偏
好及情绪变化等信息,同时也隐含着用户群体行为的规律和发展趋势。挖掘深藏在数据
背后的知识,能够发现用户习惯的观看流程,访问网站的时间及喜好的视频,各视频间
存在的关联关系等。掌握了这些知识,就能科学解决用户跳出等问题,根据用户访问习
惯改进网站服务流程,以及针对用户进行个性化服务,变革传统的网站管理和运营模式,主动提升用户的体验以促进视频网站的快速发展。
综观国内外成功的电商和视频网站等互联网企业,对用户行为信息的分析和使用,无不在这个必争之地做了大量投入。他们对数据战略性的高度认识和使用,非常值得国
内的电商学习和借鉴。
R语言作为能够进行交互式数据分析和探索的强大平台,具备一套完整的数据处理、计算和制图软件系统,在电商用户行为数据分析和挖掘领域应用广泛。基于 R 语言对视
频网站的用户在线行为数据进行分析挖掘,通过对采集到的用户行为数据进行引流指标、黏性指标的分析和挖掘,可以得到网页被访问的频繁度、停留时间、用户观看视频的喜
好等信息。将分析的结果应用到网站运营与管理中,不仅能够为网站个性化服务、精准
推销和开发新型业
务模式提供技术和理论支撑,而且能够把握当前网络关注的热点问题,从而正确引
导用户的网络舆论方向。
1.2.2? R语言处理金融大数据
最近几年,数据分析方法在商业和金融市场上的重要性持续增加,因为我们有丰富
的数据环境,经济和金融市场的数据相比以前更加综合和完整,在许多国家成百上千个
变量的数据可以更系统、更精确地搜集,计算处理上的便利和统计软件包的使用使得对
复杂的高维金融数据的分析成为可能,通过互联网可以很容易地应用开源软件包下载公
开的金融数据,如 R 语言和软件开发环境,所有这些软件的特性和功能免费公开,因而
被广泛使用。
2008 年的金融危机在某种程度上是由错误的金融模型造成的,既有模型过于简单的
原因,又有模型过于复杂的原因,房地产经纪人和买家依赖于一个隐式模型,它表明价
格已经在高位,且还会继续上涨。贷款人使用统计模型来对打包的按揭产品进行分析设
计,这似乎可以奇迹般地降低风险,然而最后的结果是灾难性的,在 4 年之后仍然可以
感受到房地产泡沫的影响。
那么,如何进行有用的并且没有危险的金融分析呢?首先应该对金融数据有一个基
本的理解,尤其是时间序列数据,因为不确定性是主要的影响因素,比如可以用概率模
型来描述资产收益率的频率分布,利用时间序列模型对数据进行描述平滑和季节调整。
使用 R 语言进行金融分析时,可以利用 R 语言的优势,研究分析基于 Hadoop 存储
证券的日内交易数据,通过 RHive 连接 R 语言与 Hive,建立相关性算法模型,在历史
数据中回测,构建投资决策组合,并生成可视化结果用于展示。
R语言quantmod包是股市金融建模应用比较多的一个包。该包从多个数据源获取历
史数据,绘制金融数据图表,以及在金融数据图表中添加各种技术指标,通过多种金融
4
R 语言与大数据编程实战
模型分析,辅助股票筛选和判断。该包获取数据的来源主要有两个: Yahoo! 和 Google。
最常用的是Yahoo!中的各种数据。但该包只能获取股票的历史交易记录信息,如最大值、最小值、开盘价、收盘价及成交量。在此基础上利用股票的历史数据,通过 R 语言建立
模型,并对数据进行分析,从模型的检验决定未来的交易行为。
1.2.3? R语言天气数据可视化
R语言天气数据可视化,就是通过获取天气的历史大数据,使用R语言和可视化技术,展示中国每个省份的天气情况,给准备旅游的朋友提供一种出行提示。除了旅游,在传
统零售行业,雨天大概会影响相对于晴天 30% ~ 40% 的销售业绩,所以从网上获取天
气数据进行分析,并根据天气数据做出预测,提前做好预防措施和提醒业务人员,把损
失减少到最低就显得十分重要。要实现天气数据可视化,需要实现的功能和遇到的问题
如下。
y 天气数据 :数据从哪里找到 ;如何下载 ;如何存储。
y 定时任务 :天气数据需要,图片需要每日新生成。
y 地图和天气可视化:要把中国行政区划图和天气数据(包括风力方向可视化)结
合在一起绘图,让用户一眼就能看明白。
y Web 展示:通过可视化技术,我们生成的只是一张静态图片,要如何发布到 Web
端进行展示。
y 微博 :结合新浪微博,让更多的用户看到并使用这个应用。
y 用户交互:用户可以查看不同日期、不同类型的图片,用户还可以通过微博分享。
从上面的描述中,单独使用一种语言不容易实现这些功能。单独用 PHP 开发,做一
个 Web 网站非常容易,连接新浪微博也有现成的 SDK 可以调用,获取数据及存储也不
麻烦,但是如何实现地图和天气数据的可视化?这个是 R 语言的强项,所以,可以将 R
语言和 PHP 语言相结合,发挥 R 语言的优势,用 R 语言的 rvest 包就可以方便获取天气
数据,并实现天气数据的可视化。
1.2.4? R语言医疗大数据分析
医疗大数据是相对于一般数据而言的,指的是人们从医疗系统的软件系统中捕捉大
容量数据,通过大数据分析获得新的认知,从而创造新的价值来源。医疗大数据几乎包
含公民所有个人信息,包括医疗、饮食、住所、旅行登记等。在临床操作方面,有5个
主要场景的大数据应用。根据麦肯锡公司的估计,如果这些应用被充分采用,针对美国
一个国家的医疗健康开支一年就将减少165亿美元。主要场景的大数据应用包括5个方面。
(1)比较效果研究。
通过全面分析病人特征数据和疗效数据,然后比较多种干预措施的有效性,可以找
到针对特定病人的最佳治疗途径。世界各地的很多医疗机构,如德国 IQWIG(德国医疗
质量和效率研究所)、加拿大普通药品检查机构等,已经开始了CER (比较效果研究)项目,并取得了初步成功。5
第1章 R 的基本介绍
(2)临床决策支持系统。
临床决策支持系统可以提高工作效率和诊疗质量。大数据分析技术将使临床决策支
持系统更智能,这得益于对非结构化数据的分析能力日益加强。比如,可以使用图像分
析和识别技术,识别医疗影像数据,或者挖掘医疗文献数据建立医疗专家数据库,从而
给医生提出诊疗建议。此外,临床决策支持系统还可以使医疗流程中大部分的工作流向
护理人员和助理医生,使医生从耗时过长的简单咨询工作中解脱出来,提高工作效率。
(3)医疗数据透明度。
提高医疗过程数据的透明度,可以使医生、医院的绩效更透明,间接促进医疗服务
质量的提高。数据分析可以带来业务流程的精简,降低成本,找到符合需求工作更高效
的员工,从而提高护理质量,给病人带来更好的体验,也给医疗服务机构带来业绩增长
潜力。公开发布医疗质量和绩效数据还可以帮助病人做出更明智的健康护理决定,这也
将使医院提高总体绩效,更具竞争力。
(4)远程病人监控。
从对慢性病人的远程监控系统收集数据,并将分析结果反馈给监控设备(查看病人
是否遵从医嘱进行治疗),从而确定后续用药和治疗方案。通过对远程监控系统产生的
数据分析,可以减少病人的住院时间,减少急诊量,提高家庭护理比例和门诊医生预
约量。
(5)对病人档案的先进分析。
在病人档案方面应用大数据分析可以确定某类疾病的易感人群。帮助识别哪些病人
有患糖尿病、高血压等疾病的高风险,使他们尽早接受预防性保健方案。这些方法也可
以帮助患者从已经存在的疾病管理方案中找到最好的治疗方案。
R 语言医疗大数据分析的主要目标是针对海量医疗数据分析,提出了医疗大数据分
析的新模式,并分析比较了两种分析模式的区别,开展R 语言等统计模型的应用研究,建立从统计模型、指标提取、统计模型检验与优化、统计模型重写、数据可视化的一套
方法,在此基础上具体针对 BI 工具发现问题,应用 R 语言进行了异常医疗质量指标的
相关因素分析。
利用 R 语言对门诊和用药大数据进行分析,利用信息技术探索基层医疗卫生机构门
诊用药规律,为合理用药提供依据。具体做法是通过省基层医疗机构管理信息系统,提
取医院门诊某阶段的用药情况。通过 arules包中的eclat函数,设置参数最小求频繁项集,即在门诊用药记录中,某种药品的出现频率,按照由大到小的次数排序,得到门诊使用
较多(频繁)的药品列表;通过 arules 包中的 apriori 函数,可以发现在门诊用药数据中
的多条关联规则。
1.3 R 的安装与启动
本节介绍 R 软件的安装与启动,以及几个好用的 IDE,再比较使用 IDE 执行代码与
直接使用 R控制台执行代码的异同。
6
R 语言与大数据编程实战
1.3.1? 安装并启动 R
R 核心团队免费向用户提供 R 软件,无论用户使用的是 UNIX、Windows 还是 Mac
OS 系统,都可以在R 网站上很方便地下载最新的 R软件。
R 网站的主页网址为 https:www.r-project.org,这是可直接登入的英文网页,在这
一主页中使用蓝色字体标出了一些超链接,分别链向与 R 相关的其他网页,比如FAQ(常
见的问题及答案)网页,以及有关R 的新闻等。
在 R 主页的 Getting Started 标题下方有一个蓝色加粗的 download R,它指向一个
CRAN 的镜像网址汇总页,汇总了分布在全球各个国家的许多镜像服务器,其中我国
至少有 4 个,用户可以选择最近的镜像。在镜像页中,用户根据自己的计算机系统选择
对应的 R 软件版本,即可点击下载。R-3.4.1 是目前最新的版本,Windows 版本大约有
62.2MB 大小,此时下载的 R 仅包含最基础的函数,在后续的学习中还需要陆续添加其
他的程序包。
执行下载好的 exe 文件,Windows 系统中将弹出一个安装向导,R 软件的安装目录
默认为系统盘,但将其安装到其他盘也不影响使用。需要注意的是在第四步中,安装向
导要求用户选择组件时,最好不要选择默认的选项。
如图 1.1 所示,当安装向导执行到第 4 步时,用户组件共有 4 个组件可供选择,默
认选项是将这 4 个组件全部安装。在“用户安装”下拉框下还有“32 位用户安装”、“64
位用户安装”、“自定义安装”三个选项,用户只需根据自己的机型选择32 位或 64 位即可,不需要将4 个组件全部下载。
R 成功安装完毕后,桌面将出现一个宝蓝色的 R 图标,只需双击 R 图标,即可启动
R 软件。
Windows 系统下运行 R 的工具也称为 RGui,即 R 图形用户界面。图 1.2 所示是一
个 64 位的 RGui。在 RGui 的菜单栏中有一些中文选项及一些快捷操作,其中最常用的
菜单选项是文件菜单和程序包菜单。
图 1.1 选择R 软件的组件
在 RGui中间还有一个更小的 R Console,也称为 R控制台,控制台是用户执行代码
的地方。蓝色的文字对R 进行了一些基本声明,并给出了一些用以查看帮助文件的命令。7
第1章 R 的基本介绍
在声明文字下方有一个醒目的红色“>”形提示符,其后跟随了一个闪烁的红色光标。“>”
提示用户在此输入命令,只需回车,命令就会被 R 执行,同时 R会在新的一行上再次生
成“>”提示符。显然,退出RGui 时,只需点击右上角红色小叉即可。
图1.2 R控制台
在 Mac OS 环境下运行 R 的工具是 R.app,在 UNIX 环境下启动 R 时需要在路径中
包含 R文件,然后输入命令R 即可。
1.3.2? 安装并启动一个 IDE
R 软件虽然提供了文本编辑器,但为了更方便地使用 R,大多数用户都会选择额外
安装一个 IDE(集成开发环境)用于辅助编程。IDE 提供一个图形开发环境,语法编辑
功能也通常更为强大。
在此向统计人员强烈推荐 RStudio 软件。RStudio 是一个专门为 R 定制的免费 IDE,它将 R 中的特色功能体现得淋漓尽致。网址 https:www.rstudio.comproductsrstudio
download 提供了适用于不同计算机平台的 RStudio 版本,包括 Windows、Mac OS、Ubuntu、Fedora 等,用户只需在“Installers for Supported Platforms”标题下方选择合适
的版本即可。
RStudio软件的安装十分简单,仅需设定安装目录和文件夹名称即可。为了方便起见,通常把 R 和 RStudio 放在同一个目录下。安装完毕后,桌面上同样会生成一个宝蓝色的、与 R 稍有区别的RStudio 图标,双击图标即可启动 RStudio软件。
如图 1.3 所示,RStudio 软件被切分为 4 个小窗口。其中,左上角的窗口用于展示 R
脚本,用户可以在这里打开已经写好的 R 脚本,或者在这里编写一个脚本而不立刻执行
它。左下角的窗口则是 R 软件的控制台,它其实就是 1.2.1 节中提到的 R 控制台,在用
户打开 RStudio时,RStudio会在后台启动 R 软件。
8
R 语言与大数据编程实战
图 1.3 RStudio软件启动界面
RStudio 的右上角显示了环境栏和历史栏,在执行代码时,环境栏会自动显示当前
程序中都有哪些变量,以及它们的属性分别是什么,当变量繁多时这一栏格外有用。历
史栏中则存有已经执行过的历史代码。右下角的窗口同样提供了好几个下拉菜单,其中
包括R中的各类帮助、函数介绍和程序包介绍。
总的来说, RStudio能够提供的信息远比R 软件丰富,它提供了更加美观的绘图窗口,用户在查看帮助时也显得尤为便捷。此外,RStudio 也支持远程访问,用户可以在平板
电脑或手机上打开它,并远程访问计算机上的R 执行代码。
RStudio 的唯一缺点在于,它只用于 R开发。因此,对并非只写 R代码的程序员来说,RStudio 也许不是最好的选择。不过有许多支持 Java、C、Python 等语言的 IDE 同样也
支持 R,其中较为流行的优质 IDE 有 Emacs、Eclipse、Tinn-R 等,用户完全可以根据自
己的喜好选择一个最合适的 IDE。
与 RStudio 相比,这些支持多种语言的 IDE 在 R 的特色功能方面体现得不如
RStudio 好,但它们能够提供诸如语法高亮、快捷操作等实用的功能。值得注意的是,有时用户需要下载专门的插件或下载专门的版本才能使IDE 支持R。
1.4 R的向量、矩阵和数组
向量、矩阵和数组是 R中的三种基本变量,也是数据分析中最常见的数据存储单位。
本节讨论这三种变量的特点,并展示它们的操作方法。
1.4.1? 向量的操作方法和固有属性
向量是一个一维变量,即一列数据的集合。它是我们在数据分析时使用的最小的单
位,矩阵和数组都是向量的扩展结果。我们通常使用 c 函数来创建向量,其他可以用
于创建向量的函数还有 seq 函数和 rep函数,其中前者用于排序,后者用于重复。9
第1章 R 的基本介绍
> x <- c(1:5)
> c(6:10) -> y
> x;y
[1] 1 2 3 4 5
[1] 6 7 8 9 10
> x[0];y[1]
Integer(0)
[1] 6
上述代码创建了两个向量并分别将它们赋给了x 和 y。第一行代码中c 函数内的冒
号表示创建一个序列,“<-”符号则将这个序列赋给了 x。第二行代码使用“->”符号
将另外一个序列赋给了 y。这两条赋值命令都是合法的,不过“<-”符号是较常见的选择。
R 并不会主动返回 x 和 y 的结果,为了查看 x 和 y 中存放的内容,我们执行了第三
条代码。第三条代码使用分号隔开了 x 和 y,因此 R 会同时返回这二者。显然,x 中存
放了序列 1,2,3,4,5,y 中存放了序列 6,7,8,9,10。此外,也可以使用下标查看向量中的某
个具体元素,R 中向量的下标从 1 开始标起,这一点与C 语言等其他语言是不同的。第
4 条代码查看了向量 x 中下标为 0 的元素和向量 y 中下标为 1 的元素,可以发现,x[0]
返回了一个奇怪的结果,y[1]则返回了 y中第一个元素。
> z <- c(x,y,11,12)
> z
[1] 1 2 3 4 5 6 7 8 9 10 11 12
> z <- x+y
> z
[1] 7 9 11 13 15
> names(z) <- c(a,b,c)
> z
a b c
7 9 11 13 15
c 函数同样可以用于拼接向量,它既可以将已有的向量拼接起来,也可以将已有的
向量和新的数字拼接起来。上述代码中第一条代码将向量x、y 和数字 11、12 拼接成一
个更长的向量 z,第二条代码展示了向量z 中存储的内容。
第三、四条代码将向量 x 和 y 相加后的值赋给了向量 z,并查看了 z。由于 x 和 y 的
长度相同,因此 z 中存储的内容即为 x 和 y 中元素一一对应相加后的结果。R 中可以直
接在向量上执行加、减、乘、除等基本运算,但需要保证执行运算的两条向量长度相等,否则将得到难以解释的或错误的结果。在执行了第 3、4 条代码后,向量 z 中的内容已
经被替换为了序列 7,9,11,13,15。
我们不仅可以为向量命名,向量中的每一个元素也可以单独得到名字。第4 行使用
names 函数为向量 z 中的元素命名,双引号引起的 a、b、c 表示这三个字母在这里是字
符形式,当然,它们也不可能是别的形式。由于我们只命名了三个向量,因此向量 z 中
只有前三个元素有名字,后两个元素的名字为,也就是空的意思。为元素命名和
为向量命名遵循一样的规则,即名字中只能含有字母、数字、点和下画线,但不能以数
10
R 语言与大数据编程实战
字或一个点后跟数字开头,也不能和R 中的保留字相同,比如 if和for。
> min(z)
[1] 7
> range(z)
[1] 7 15
> sum(z)
[1] 55
> var(z)
[1] 10
作为一个统计软件,R 中内置的运算函数非常丰富,写起来也非常方便。上述代码
给出了 min 函数、range 函数、sum 函数和 var 函数 4 个函数,它们的功能分别是
对 z 取最小值、给出 z 的范围、计算z 的和、计算z 的方差。
其他经常用到的向量运算函数还有用于取出数据集中最大值的max 函数,求最值
元素的下标数的which.min函数和which.max函数,求向量中元素连乘积的prod函数,求均值、标准差、顺序统计量的函数,求积分的函数等。这些函数不但可以用于向量运算,也可以仅对向量中的某些元素进行运算。
> length(z)
[1] 5
> mode(z)
[1] numeric
> z <- as.character(z)
> mode(z)
[1] character
> min(z)
[1] 11
与向量相关的另一个重要知识是向量的属性。我们同时关心向量的长度和类型。
length 函数用于查看向量的长度,由上述代码可知,向量 z 的长度是 5。mode 函数
用于查看向量的类型,显然,向量 z 的类型是 numeric 型,即数值型。第三行代码使
用 as.character 函数将向量 z 的类型转换为字符型,其他类似函数还有 as.factor 函数、as.integer函数等。此时再次查看向量 z 的类型,其返回结果显示 z已变为了字符型。
向量的类型与其适用的运算函数有关,当向量z变为字符型后,再次查看它的最小值,此时出现的结果为 11,显然不是我们想要的结果。通常无须声明新向量的类型,R 就会
自动为新向量分配一个合适的类型。而向量的类型转换也不是没有限制,比如数值型的
向量可以转为字符型,但存储了字母元素的字符型向量就无法转化为数值型向量。
1.4.2? 矩阵的操作和运算
在向量、矩阵、数组中,矩阵是最具价值的一类变量。矩阵可以看作向量的拓展,向量是只具有长度的一维变量,而矩阵则是同时具有“长度”和“宽度”的二维变量,在实际的数据分析工作中,许多数据都以矩阵的形式进行处理。11
第1章 R 的基本介绍
> x <- c(1:12)
> matx1 <- matrix(x,nrow=3)
> matx1
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
不妨从矩阵的创建开始学习矩阵的特性。上述代码中第1行代码创建了一个1~12的
数字序列 x,第 2 行代码则利用 matrix 函数创建矩阵 matx1。在第 2 行代码中向
matrix函数传入了两个参数,第1 个参数设定使用x 的值创建矩阵,第2 个参数则指定
矩阵的行数为 3。matrix 函数中还可以设定其他的函数,如利用 ncol 参数来设定矩阵
的列数,nrow 函数和 ncol 函数能够查看矩阵的行数和列数。在 R 控制台中输入
“?matrix”可以查看 matrix函数的帮助文档。
查看 matx1,容易发现这是一个 3 行 4 列的矩阵,序列 x 逐列填充了这个矩阵。由
于 12 正好是 3 的倍数,因此序列 x 恰好填满了一个整齐的矩阵,倘若元素个数和矩阵
行数不成倍数关系,R就会自动用前几个元素填满矩阵的最后一列,并给出一个警告。
R 在返回矩阵时,同时还返回了行和列的下标。由于矩阵是一个二维变量,所以矩
阵中的元素需要两个下标来标识位置。与向量元素相似,矩阵元素的下标同样用 [] 符号
括起来,并用逗号分开两个不同下标。如 [2,3]就表示处于矩阵第二行、第三列位置的元
素。在 R 控制台中输入命令 matx1[2,3] 即可查看矩阵 matx1 中下标为 [2,3] 的元素,输
入命令 matx1[2,] 即可查看矩阵 matx1 中第二行中所有的元素,这种规则同样适用于进
行矩阵运算。
> rownames(matx1) <- c(x1,x2,x3)
> colnames(matx1) <- c(y1,y2,y3,y4)
> matx1
y1 y2 y3 y4
x1 1 4 7 10
x2 2 5 8 11
x3 3 6 9 12
> as.vector(matx1)
[1] 1 2 3 4 5 6 7 8 9 10 11 12
显然,矩阵这种二维数据结构是最常用的结构,它就像一张大表,能够放入一行行
个案和一列列变量。因此,为矩阵命名是非常必要的一件事,尤其是为列命名。在矩阵
中为行命名的函数是 rownames 函数,为列命名的函数是colnames 函数。这两个函数
的用法都和names 函数类似,将一个字符向量中的元素逐个设为矩阵的行或列的名字。
查看 matx1 中存储的内容,此时矩阵的名称都设定完毕,矩阵中的信息将更加丰富。
二维的矩阵同样可以压缩为一维的向量,上述代码中最后一行代码使用as.vector
函数完成了这项任务。由于我们在后续程序中并不打算再次使用这个向量,因此这行代
码并没有使用“<-”符号将它赋给某个变量,于是 R 直接返回了这个向量中的内容。此
时矩阵 matx1 再次成为一个1 ~ 12的序列。
12
R 语言与大数据编程实战
> class(matx1)
[1] matrix
> cbind(matx1,matx1)
y1 y2 y3 y4 y1 y2 y3 y4
x1 1 4 7 10 1 4 7 10
x2 2 5 8 11 2 5 8 11
x3 3 6 9 12 3 6 9 12
> rbind(matx1,matx1)
y1 y2 y3 y4
x1 1 4 7 10
x2 2 5 8 11
x3 3 6 9 12
x1 1 4 7 10
x2 2 5 8 11
x3 3 6 9 12
除 mode 函数能够查看的元素类型外,变量的类型同样很重要。上述代码中第一行
代码使用 class 函数查看了 matx1 的变量类型,R 的返回结果为矩阵。class 函数能够
查看多种变量的类型,与元素类型相似,只有在变量类型已知时我们才能正确地选择操
作函数。
合并矩阵时需要专门的函数。cbind 函数用于按列合并矩阵,rbind 函数用于按
行合并矩阵。上述代码分别使用这两个函数将两个matx1 矩阵合并为一个新矩阵,在按
列合并时,新矩阵的列数将增多,按行合并时,新矩阵的行数将增多。cbind 函数和
rbind 函数同样可以拼接两个不同的矩阵,不过在使用 cbind 函数时,被拼接的矩阵
的行数务必一致;在使用 rbind 函数时,被拼接的矩阵的列数务必一致,否则R 将报错。
> matx2 <- matrix(c(13:24),nrow=4)
> colnames(matx2) <- c(y5,y6,y7)
> rownames(matx2) <- c(x4,x5,x6,x7)
> matx1%%matx2
y5 y6 y7
x1 430 452 474
x2 500 526 552
x3 570 600 630
在行列数一致时,两个矩阵同样能够完成四则运算,还有一些特别的矩阵运算也
很实用。上述代码首先创建了一个 4 行 3 列的新矩阵 matx2,在创建 matx2 时我们用一
种更简洁的方式写出了 matrix 函数。第 4 行代码使用“%%”运算符计算了 matx1 和
matx2的内积,内积结果中分别保留了matx1中的行名称和 matx2中的列名称。
> matx3 <- matrix(c(3,0,3,2,5,7,1,-3,5),nrow=3)
> t(matx3)
[,1] [,2] [,3]
[1,] 3 0 3
[2,] 2 5 7
[3,] 1 -3 513
第1章 R 的基本介绍
> solve(matx3)
[,1] [,2] [,3]
[1,] 0.43809524 -0.02857143 -0.10476190
[2,] -0.08571429 0.11428571 0.08571429
[3,] -0.14285714 -0.14285714 0.14285714
上述代码创建了一个行数和列数相同的方阵。方阵是最特殊的一种矩阵,它能够进
行的运算也最丰富。t 函数的结果是矩阵的转置,solve 函数的结果则是矩阵的逆。能
够用于方阵的函数还有用于进行奇异值分解的 svd 函数等。
1.4.3? 数组中的维度函数
与其他语言中定义的数组相类似,R 中的数组是一种高维的数据结构。矩阵可以看
作数组的一种特殊形式,由于维数过高时无论作图还是运算都非常不方便,因此数组是
最不常用的一种变量。
> ary1 <- array(1:12,dim=c(2,3,2))
> ary1
, , 1
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
, , 2
[,1] [,2] [,3]
[1,] 7 9 11
[2,] 8 10 12
> class(ary1)
[1] array
上述代码使用 array 函数创建了数组 ary1。array 函数中第一个参数表示使用从
1 到 12 的序列创建矩阵,第二个参数 dim 则指明数组共有 3 个维度,维度值分别是 2、3、2。
查看 ary1 中存放的数据,它由两个二行三列的矩阵构成,每一个矩阵又有一个属于
自己的序号。观察 [ ] 框中序号和逗号之间的顺序,可以发现,ary1 中第一维由两个矩
阵的行构成,第二维由两个矩阵的列构成,第三维则由矩阵前方的序号构成(这两个序
号前面都有两个逗号,表示它们是第三维)。
> dimnames(ary1) <- list(
+ c(a,b),+ c(c,d,e),+ c(f,g))
> ary1
, , f
14
R 语言与大数据编程实战
c d e
a 1 3 5
b 2 4 6
, , g
c d e
a 7 9 11
b 8 10 12
由于数组的维数是不固定的,因此为数组命名时统一由 dimnames 函数完成。上述
代码中首次出现了代码连接符。为了整洁美观,我们把较长的第一句代码拆成4行短代码。
第一行代码结束时R 检测到这句代码还未结束,便自动生成一个加号用以连接下一行代
码。这种形式在复杂程序中经常出现。
列表函数 list 将三个 c 函数生成的向量组合起来,并用来创建 ary1 中的名称,其
中第 1 个向量中的元素用于为ary1 的第一维变量命名,第 2 个向量中的元素用于为第二
维向量命名,第3个向量则和第三维形成对应关系。
> ary2 <- array(1:6,dim=c(2,3))
> ary2
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
> class(ary1);class(ary2)
[1] array
[1] matrix
在创建数组并命名的过程中我们已经发现,维数多于二维的数组表现起来较为烦琐,每个维度的意义难以理解,运算起来更是非常不方便,远不如多创建几个矩阵方便。作
为数组的一种特殊形式,矩阵同样可以通过 array 函数创建。上述代码中 array 函数
的 dim 参数仅设置了两个维度,此时数组 ary2 看起来与矩阵似乎毫无区别,为了确定二
维数组和矩阵是否一致,第三行代码中利用 class 函数分别查看了 ary1 和 ary2 的变量
类型,ary1仍是数组类型,而 ary2 则变为矩阵类型。
1.5 R的列表和数据框
除向量、矩阵和数组外,列表和数据框也是 R 中两类基本的数据结构,这二者比向量、矩阵和数组更加灵活,是应用范围更广的两类变量。本节简单介绍列表和数据框的特性,并将它们与向量、矩阵和数组进行对比。
1.5.1? 列表的特性和编辑方法
列表是向量的一种特殊形式,它同时又与数组的形式有些相似。在 1.3 节中我们为15
第1章 R 的基本介绍
数组 ary1 命名时创建了第一个列表,其中包含三个长度分别为 2、3、2 的元素。
> lst <- list(c(1,2),c(3,4,5),c(6,7))
> lst
[[1]]
[1] 1 2
[[2]]
[1] 3 4 5
[[3]]
[1] 6 7
> names(lst) <- c(one,two,three)
> lst
one
[1] 1 2
two
[1] 3 4 5
three
[1] 6 7
上述代码中第一行代码再次创建了一个包含三个长度分别为 2、3、2 的元素的列表
lst,list 函数中使用逗号将三个元素分开,每个元素又由 c 函数构建。不妨将列表 lst
看作一个包含三个元素的向量,只不过列表中每个元素又由更小的元素单位组成。查看
lst 中存放的数据,其存放数据的方式与数组有些类似,不过列表只具有两个维度,每个
维度的下标标识也与数组不相同。
列表的命名函数与向量一致。使用 names 函数可以很方便地为列表的每个元素命
名,再次查看 lst,其中的元素已经被命名完毕,注意元素名称由一个 符号标出。
> lstone <- c(a,b)
> lst
one
[1] a b
two
[1] 3 4 5
three
[1] 6 7
> lstfour <- list(c(8,8),c(9,9))
> lst
one
[1] a b
16
R 语言与大数据编程实战
two
[1] 3 4 5
three
[1] 6 7
four
four[[1]]
[1] 8 8
four[[2]]
[1] 9 9
> unlist(lst)
one1 one2 two1 two2 two3 three1 three2 four1 four2 four3 four4
a b 3 4 5 6 7 8 8 9 9
与仅能存放一种数据类型的向量不同,列表中能够存放多种类型的数据。上述代码
中第 1、2 行代码将列表 lst 中的第 1 个元素替换为了字符型数据 a、b;第 4、5 行元素
在列表lst 中增加了一个新的元素four,新元素是一个包含两个元素的小列表,在列表中
嵌入列表是合法的做法。此时 lst 中的数据结构变得更加复杂,显然列表中嵌入列表这
种做法的可读性并不强,因此通常不这样做。
在前 4 行代码中使用“列表名 ++ 元素名”这种形式来指定操作对象,这是列表操
作中较为特殊的一点,除非事先用 attach函数绑定列表,否则不能直接使用元素名。
列表同样可以转换为向量形式。上述代码中第 5 行代码使用 unlist 函数将 lst 转换
成向量,向量的元素名由列表的元素名生成。由于 lst 中既有字符元素,也有数值元素,而数值型可变为字符型,反过来则不合法,因此转换后的向量是字符型的(这一点由向
量元素被双引号引起可知)。使用as.list 函数也可以将向量转换为列表。
> lst2 <- c(list(zero=c(1,2)),lst)
> lst2
zero
[1] 1 2
one
[1] a b
two
[1] 3 4 5
three
[1] 6 7
four
four[[1]]17
第1章 R 的基本介绍
[1] 8 8
four[[2]]
[1] 9 9
c 函数既可以拼接向量,也可以拼接列表 ;既可以将列表和向量拼接起来,也可以
将列表和列表拼接起来。上述代码拼接了两个小列表,其中第一个列表直接在 c 函数
内用 list 函数生成,第二个列表则是 lst 列表。我们在生成第一个列表时直接在 list 函
数内命名,这种简洁的做法也是合法的。
> lstthree+lst2zero
[1] 7 9
> lst[[3]]+lst2[[1]]
[1] 7 9
> lst[3]+lst2[1]
错误于lst[3] + lst2[1] : 二进列运算符中有非数值参数
在对列表进行运算时有两种方法。上述代码中第一行代码利用元素名进行运算,第
2 行代码利用元素下标进行运算,这两条代码相互等价。由于列表中元素的长度和类型
不要求一致,因此对列表中元素进行运算时需要确认被运算的两个元素的长度和类型符
合运算条件,否则会报错。
使用列表的下标时也需要格外小心。在第2行代码中使用两个方括号括起了下标数,这样取出的内容就是元素中的内容,当只用一个方括号括起下标时,取出的内容就是该
元素。这是两个不同的概念,具体来说,第 2 行代码取出内容的类型是数值,而第 3 行
代码取出内容的类型则是列表,因此第3 行代码会报错,不过这并不是说“lst[3]”这种
操作是不合法的,它只是不能够用于四则运算。
1.5.2? 数据框的创建和基本操作
在所有的数据结构中,数据框是最常用的一类结构。它与矩阵相似,具有规整的二
维结构,同时数据框允许在不同列中存储不同的数据类型,这使得数据框要比矩阵更
实用。
> df <- data.frame(x=c(a,b,c,d),y=c(1,2,3,4),z=c(5,6,7,8))
> df
x y z
1 a 1 5
2 b 2 6
3 c 3 7
4 d 4 8
> dfz0 <- dfz>6
> df
x y z z0
1 a 1 5 FALSE
2 b 2 6 FALSE
18
R 语言与大数据编程实战
3 c 3 7 TRUE
4 d 4 8 TRUE
上述代码显示了数据框的创建和增添。其中,第 1 行代码使用 data.frame 函数创
建了一个 4 行 3 列的数据框 df,在 data.frame 函数中同时也规定了每一列的名称。在
创建数据框时如果不指定名称,R 会自动为每一列分配名称,通常是 X1、X2、X3……
这种形式。
与列表相似,在没有使用 attach 函数绑定数据框之前,调用数据框中的变量时需
要使用“数据框名 ++ 变量名”的格式。上述代码中第三行代码在数据框 df 中添加了
一个新列 z0,z0 中的元素是判断 df 中 z 变量是否大于 6 的逻辑值,若不等式成立,z0
的结果就是“TRUE”,反之则是“FALSE”。
> df[2:3,-4]
x y z
2 b 2 6
3 c 3 7
> df[dfy>3,c(x,z)]
x z
4 d 8
数据框中元素下标的表示方法与矩阵类似,在数据框中,使用元素下标进行操作非
常方便。上述代码利用下标筛选查看了df 中的数据,其中,第1 行代码查看了第2~3 行
的数据,参数“-4”表明返回结果中去掉第 4 列(但 df 中的数据并未改变);第 2 行代
码筛选出数据框 df 中 y 变量的值大于 3 的数据,并查看了 x 列和 z 列,注意方括号中第
一个参数需要写成“数据框名++ 变量名”格式,否则R 将报错。
> nrow(df)
[1] 4
> names(df)[4] <- z1
> df
x y z z1
1 a 1 5 FALSE
2 b 2 6 FALSE
3 c 3 7 TRUE
4 d 4 8 TRUE
数据框的拼接与矩阵类似,cbind函数和rbind函数能够将两个数据框按列或按行
合并,不过被合并的数据框需要满足列数相等或行数相等。此外,由于实际应用中数据
框往往比较大,因此统计数据框的行数和列数是非常必要的,上述代码中第1行代码使
用nrow函数统计了数据框的行数,与之相对的是ncol函数,它可以统计数据框的列数。
上述代码中第 2 行代码修改了 df 中第 4 列的列名。数据框的列名称总是被存储在一
条向量中,因此 df[4] 这种写法就相当于 df[4,],表示 df 中的第 4 列,相对的,df[,4] 则
表示数据框df 中的第 4 行。
> lst <- as.list(df)19
第1章 R 的基本介绍
> lst
x
[1] a b c d
Levels: a b c d
y
[1] 1 2 3 4
z
[1] 5 6 7 8
z1
[1] FALSE FALSE TRUE TRUE
> df2 <- as.data.frame(lst)
> df2
x y z z1
1 a 1 5 FALSE
2 b 2 6 FALSE
3 c 3 7 TRUE
4 d 4 8 TRUE
数据框和列表之间也存在相互转换的函数。其中,as.list 函数能将数据框转换为列
表,as.data.frame 函数能将列表转换为数据框。查看第 1、2 行代码得到的返回结果,df 中的 4 列被存储为 4 个元素,这 4 个元素顺序构成了列表,需要注意的是,其中元素
x 有一个 Levels 标注,这表明元素 x 是因子型的,这是由于数据框会自动将字符型变量
存储为因子型,stringAsFactors函数能够避免这种强制转换。
上述代码中第 3、4 行代码显示了列表如何转换为矩阵,并不是所有的列表都可以
转换为矩阵,只有元素长度都相等的列表才可以。除列表外,矩阵和一些其他形式的数
据也可以转换为数据框。
1.6 R 数据文件的载入和载出
R 支持多种数据文件的载入和载出。本节讨论纯文本文件、非结构化文本文件、其
他统计软件格式文件和网页文件等多种不同的文件类型,并介绍一些基本的文件读取函
数的用法。
1.6.1? 结构化纯文本文件的读取和输出
结构化纯文本文件是最常用到的一类文件,也是最好处理的一类文件。这类文件中
每行都存储一条数据,每条数据中的元素又由分隔符分开,当分隔符是逗号时,纯文本
文件就是 csv格式的 ;当分隔符是空格时,纯文本文件就是 txt格式的。
图 1.4 显示了文件 txtdata 中的前几条数据。显然,这个文件中有三列数据,列名称
20
R 语言与大数据编程实战
分别为 x、y、z,由于这个文件中的数据是由制表符分割的,因此该图中两个数据之间
的缝隙显然比较大,对于 R 来说,制表符和空格造成的效果是一样的,因此这并不影响
代码的执行。
图 1.4 txtdata文件数据格式
> getwd
[1] C:UsersDocuments
> txt <- read.table(txtdata.txt,header=TRUE)
> head(txt)
x y z
1 3.542485 1.977398 -1
2 3.018896 2.556416 -1
3 7.551510 -1.580030 1
4 2.114999 -0.004466 -1
5 8.127113 1.274372 1
6 7.108772 -0.986906 1
在正式读取数据之前,还需要先将数据文件放到 R 的工作目录下。如果你不知道你
计算机上 R 的工作目录是哪条路径,可以使用命令“getwd”来查询,比如笔者的查询
结果为C:UsersDocuments,这条路径就是笔者的R 的工作目录。
将 txtdata 文件放到工作目录下,即可用 read.table 函数来读取文本文件中的内容。
read.table 函数中第一个参数指定读取的文件是 txtdata.txt 文件,注意,这个参数中的
文件扩展名绝对不能省略,如果没有写明文件扩展名,R 就会报错;第二个参数指定
header 为真,也就是读取的文件中存在表头,由于 txtdata文件中写明了数据的列名称是 x、y、z,因此需要设定这个参数。
第 3 行代码使用 head 函数查看了 txt 中的前 6 行数据,如果直接查看 txt,显然,R 就会刷出好几屏的数据。从 head 函数的返回结果可知,此时 txtdata 中的数据已经成
功载入到 R 中,这三列数据规规整整地排列在一起,列名称也没有搞错。
如图1.5 所示,文本文件csvdata中存放的数据和文件txtdata中的数据是一致的,只
不过 csvdata 中的数据是由逗号进行的分割,而且这份数据没有表头。同样可以用 read.
table函数读取数据。21
第1章 R 的基本介绍
图 1.5 csvdata 文件数据格式
> csv <- read.table(datacsvdata.csv,sep=,)
> head(csv)
V1 V2 V3
1 3.542485 1.977398 -1
2 3.018896 2.556416 -1
3 7.551510 -1.580030 1
4 2.114999 -0.004466 -1
5 8.127113 1.274372 1
6 7.108772 -0.986906 1
R 可以读取并未放在工作目录下的文件,比如 csvdata 文件的存放目录为 C:Users
Documentsdata,在读取文件时,read.table 中的第一个参数写明读取的是 data 文件夹
下的 csvdata 文件(data 前的工作目录已被省略)。类似地,如果想要R 读取存放在其他
盘的文件,只需在 read.table中的第一个参数处写明文件目录即可。
read.table 中的第二个参数设定为 sep 值为逗号,即文件的分隔符为逗号。通过设
定 sep 值,read.table 函数可以读取由不同分隔符分割的多种文件。除 header 和 sep 外,read.table 函数还提供了用于指定读取行数的 nrow 参数、跳过开头几行的 skip 参数、确定行名称和列名称的参数、指定文件的字符编码参数等,在 R 控制台中输入“?read.
table”可以查看它的更多信息。
与 read.table 非常相似的函数还有分隔符默认为逗号的 read.csv 函数;小数位默
认为句号、分隔符默认为制表符的 read.delim 函数等。此外还有一个更为灵活的 scan
函数用于读取不标准的文本文件,它能够写出更复杂的读取命令。无论是哪个函数,它
们都会自动将读取的数据设置为数据框格式。
> write.csv(csv,?le=csv2.csv)
> write.table(txt,?le=txt2.txt)
与读取文件相对应的是文件的输入,显然,write.csv函数用于输出 csv格式的文本
文件,write.table 函数用于输出 txt 格式的文本文件,另外,还有一个 write 函数也能
实现同样的功能。上述两条代码利用数据框 csv生成了 csv2.csv 文件,利用数据框 txt生
成了 txt2.txt 文件,这两个文件都存放在 R 的工作目录下,若要存放到其他目录下,只
需在 ?le参数中注明即可。
22
R 语言与大数据编程实战
1.6.2? 其他文件的读取和输出
文本文件中除存储用分隔符分开的数据表外,也可能存储着真正的字符数据。R 提
供了 readLines 函数来逐行读取文本信息,作为例子,emaildata.txt 是一个放在 R 工作
目录下的邮件。
> email <- readLines(emaildata.txt)
> head(email)
[1] WHat is going on there?
[2] I talked to John on email. We talked about some computer stuff that's it.
[3]
[4] I went bike riding in the rain, it was not that cold.
[5]
[6] We went to the museum in SF yesterday it was 3 to get in and they had
上述代码使用 readLines 函数读取了 emaildata.txt 中的信息,由于字符文件的结构
松散,因此表头、分隔符等参数都是不需要设定的。 head函数查看了email的前6个元素,它们正好和emaildata中的前6行相对应。显然,这种数据结构并不是数据预处理的终点,通常还需进一步处理后,非结构的文本文件才能用于数据分析。
> class(email)
[1] character
> writeLines(email,email2.txt)
与 readLines 函数相对应的是 writeLines 函数,这个函数将字符向量逐行地输出
为一个文本文件。实际上,readLines 函数读入的数据也是向量类型的。需要注意的是
在 writeLines 函数中指定输出文件的参数写作 email2.txt,而 ?le=email2.txt 这种写
法是不合法的。
除结构化文本文件和非结构化文本文件外,来自其他统计软件的数据、来自网页的
数据和来自数据库的数据也是常见的数据源,R 同样为这些数据提供了用于读取和输出
的函数。
其他统计软件的数据主要包括来自 Excel、SAS、SPSS、Stata、MATLAB 等统计
软件的数据。xlsx 包提供的 read.xlsx 函数能够读取 Excel 软件所生成的 xlsx 文件;
foreign 包同时提供了能够读取 SAS 文件的 read.ssd 函数、能够读取 DTA 文件(由
Stata 软件生成)的 read.dta 函数和能够读取 SPSS 文件的 read.spss 函数;R.matlab 包
则提供了能够读取 MATLAB 文件的 readMat 函数。除这些方法外,还可以先将其他软
件格式的数据转换为文本文件格式,再读取到 R中。
来自网页的数据成分较为复杂,有一些网站提供了对应的 csv 数据文件以供下载和
读取;另一些网站则提供了专门的包,包中具有读取数据的函数;其他那些既不提供下
载文件也不提供包和函数的网站就显得较为复杂,简单来说,我们需要人工分析其网站
源代码,找到有效数据,并找到数据在前后文中的标签,通过设置标签来使R 下载数据,下载完毕后还需进一步加工才可以将数据正式投入数据分析中。即便R提供了众多函数,这也仍是一件很复杂的事情。23
第1章 R 的基本介绍
来自数据库的数据是最后一类常见的数据。数据库能够管理海量数据,并允许多人
访问,这在企业应用中最为常见。要从数据库中获取数据,就首先要加载使 R 能够连接
到数据库的包,以 MySQL 为例,对应的包就是 RMySQL 包,设置好驱动器类型和文件
路径后,即可从 MySQL中读取文件。
1.7 向 R 中安装包
在 1.5 节关于数据读取的讨论中,多次提到了包的概念。在 R 中,包是一个重要的
概念,R 社区内所有用户的共同努力使得如今已有成千上万的R 包可供使用,这些R 包
拓展了 R 的用途,对数据分析师来说,如何选择合适的 R包用以数据分析是一个重要的
命题。
在下载R时,我们已经附带着下载了一些基本包,但这些包远远不够,比如,ggplot2
程序包就是一个非常重要、应用非常广泛的绘图包。向 R 中安装包时,利用 GUI 是最
方便的选择。在正式开始安装包之前,用户务必要保证自己的电脑处于联网状态,并不
受下载限制。
在 RGui 中的顶部菜单栏中有一个程序包下拉菜单,这一个菜单中的选项全都是关
于R程序包的安装与维护的。在正式安装程序包之前,我们需要首先设定镜像。通常来说,无论是选择“设定 CRAN 镜像”,如图 1-6 所示,还是选择“安装程序包”,RGui 都会
首先让用户设定镜像。
图 1.6 选择一个 CRAN镜像
在RGui提供的镜像中,来自中国的镜像共有4个,(见图1.7),分别是China(Beijing1)、China(Beijing2)、China(Hefei) 和 China(Xiamen)。无论是本国的镜像还是外国的镜像,它们提供的东西都是完全一致的,因此建议你选择一个最近的镜像,这样能保证下载速
度是最快的。
24
R 语言与大数据编程实战
图1.7 镜像设定对话框
在设定好镜像后,用户即可选择程序包进行安装。选择“安装程序包”,RGui 将提
供一个相当长的列表,其中按照字母顺序列出了绝大部分已有的 R包。从中找到 ggplot2
包,如图 1.8 所示,选中后单击“确定”按钮,RGui 将自动从 R 主页上下载 ggplot2 相
关的文件,并完成安装。有些包的安装需要依赖另一些包,此时 R 控制台将给出提示信
息,只需先安装好依赖包,再安装需要的包即可。
图1.8 选择一个程序包进行安装25
第1章 R 的基本介绍
除利用 GUI安装 R 包外,也可以直接使用编程的方式安装包。
> install.packages(ggplot2, repos=http:mirror.bjtu.edu.cncran)
上述代码同样安装了 ggplot2 包,install.packages 函数达到的效果和直接选择“安
装程序包”一样。同时 install.packages 函数设定的镜像网址是 http:mirror.bjtu.edu.cn
cran,这是一个中国的网址,在 https:cran.r-project.orgmirrors.html 页面可以查看其他
的中国镜像网址。
在 install.packages 函数不起作用的时候,用户也可以直接进入 R 主页下载相关的
zip 文件,并进行本地安装程序包的操作。
安装好程序包后,在使用程序包中的函数时还需向 R 中加载包,此后才能调用包中
的函数。
> library(ggplot2)
> help(package=ggplot2)
library 函数用于向 R 中加载包,注意包的名称不需要引号。使用 help 函数可以
查看 ggplot2 中包含的全部函数及它们的说明文档。加载好包后,调用包中函数时直接
写出函数名即可,只有在同时加载的多个包中出现了一样的函数时,才需要用“程序包
名 + ::+函数名”的形式对多个名称一样的函数进行区分。
> update.packages
> remove.packages(ggplot2)
上述两条代码是与包相关的最后两个重要代码,其中第 1 行代码对已有的包进行了
更新,第 2 行代码则删除了包 ggplot2,当然,第 2 行代码也能够用于删除其他的包。
第 2 章 原始数据的探索与预处理
第 1 章详细地介绍了 R 的基础知识,第 2 章围绕数据的探索与预处理进一步展开。
数据的探索和预处理是数据分析中的第一项任务,本章将讨论最常见的数据探索方法和
预处理方法,数据框是本章讨论的主要形式,在第二部分的数据挖掘实例中对本章内容
还将更深入地进行讲解。
2.1 度量数据集的集中程度
均值、分位数和众数是一列数据的基本特征,也是最常见的统计量,在对原始数据
进行探索时,这三个量能够简单地刻画出数据的轮廓,度量出数据集的集中程度。R 包
datasets 中存储了许多示例数据集,其中 ChickWeight 数据集是一份关于销售数据的领先
指标数据。
> library(datasets)
> head(BJsales)
[1] 200.1 199.5 199.4 198.9 199.0 200.2
> class(BJsales)
[1] ts
> mode(BJsales)
[1] numeric
> length(BJsales)
[1] 150
向 R 中载入程序包 datasets 后,数据集 BJsales 即可直接调用。上述代码分别查看
了 BJsales 的一些基本性质,其中,第 2 行代码查看了 BJsales 的前 6 个元素,显然,BJsales 并不是一个数据框。第 3 行代码查看了 BJsales 的属性,返回结果为 ts,这表
明 BJsales 中存放的是一列时间序列向量,即 BJsales 中的数据是按照时间顺序排列的。
在控制台中输入“?ts”可以查看更多关于数据类型ts 的信息。
mode函数的返回结果表明BJsales中的数据是数值型的,因此,计算BJsales的均值、中位数和分位数是有意义的。 length函数给出了BJsales中元素的个数,由返回结果可知,BJsales 中共有 150 个元素。
> mean(BJsales)
[1] 229.978
> mean(BJsales,trim=0.1)
[1] 229.715
> median(BJsales)
[1] 220.6527
第2章 原始数据的探索与预处理
均值和中位数是有些相似的两个统计量。均值是用所有元素的和除以所有元素的个
数得出的结果,其计算公式为 n
x
n
1 i
i ∑ = 。中位数则是将元素按顺序排列后处于正中间的数,当对偶数个元素计算中位数时,中位数是最中间两个数的均值。显然,均值和中位数都
居于总体数据的中央位置,但均值易受异常值影响,而中位数则不。
上述代码中前两行代码都使用了 mean 函数,第 1 行代码计算了 BJsales 中全体元
素的均值,第 2 行代码中的 trim 参数指定在计算均值时数值最大的 10% 的元素和数值
最小的 10% 的元素都要去掉,trim 函数能够削弱异常值的影响。这两种计算方法的结果
十分接近,说明 BJsales 中并无偏离大部分数据较远的异常值。
median函数给出了 BJsales的中位数,中位数要比均值小一些,也就是说,BJsales
中较小的数据分布较集中,较大的数据分布较分散,数据总体呈右偏分布。
> quantile(BJsales)
0% 25% 50% 75% 100%
198.600 212.575 220.650 254.675 263.300
> quantile(BJsales,c(0.85,0.9,0.95))
85% 90% 95%
257.60 259.06 261.21
quantile 函数能够给出数据的分位数,它有好几种用法,上述代码给出的是最常用
的两种用法。其中,第 1 行代码直接给出了 BJsales 的五分位数,比较分位数之间的距离,容易发现上四分位数与中位数的距离要小于它与最小值的距离,下四分位数与中位数的
距离要大于它与最大值的距离,而最小值与中位数的距离又小于最大值与中位数的距离,这也佐证了 BJsales是右偏分布的结论。
第 2 行代码查看了 BJsales 中处于 85%、90% 和 95% 这三个位置的元素,通过设
定 c 函数给出的分位数位置,quantile 函数可以查看处于任意百分位处的元素。显然,中位数是分位数的一个特例。
众数是一个较为特殊的统计量,它代表数据集中出现次数最多的数。将数据集中的数
据按照出现次数的多少顺序排列后,我们能够大致地看出数据集的分散程度。然而由于R
中浮点数的小数位很长,因此,统计每个值出现的次数并找出众数是不太可能的。R中并
没有计算众数的函数,不过在一些绘图函数中,众数被可视化地表达了出来。
2.2 度量数据集的分散程度
数据集的分散程度主要从方差、标准差、标准误、偏度系数和峰度系数等统计量加以
考量。本节仍旧使用了领先指标销售数据的数据集,其分析结果将和2.1节的结果互为佐证。
2.2.1? 极值、方差和标准差
极值、方差和标准差是较为常见的统计量,它们经常用于度量数据集的分散程度。
28
R 语言与大数据编程实战
R 中内置了好几种函数用以计算这些统计量。
> range(BJsales)
[1] 198.6 263.3
极值是对数据集的极小值和极大值的总称。在第 1 章中已经提到过 min 函数和
max 函数,它们分别给出数据集的极小值和极大值,与之类似地是 range 函数,它同
时给出两个极值。上述代码是对 BJsales 应用 range 函数的结果。另外,2.1 节中用于
计算分位数的 quantile 函数也能够用于计算极值。总的来说,range 函数是计算极值
时的首选。
极值具有容易理解的特点,但它也容易受异常值的影响。极值只能度量出数据集的
两端范围,刻画不出其他那些非极值点的密集程度和分布情况。因此,极值提供的信息
非常有限,它通常扮演着一个辅助分析的角色。
> var(BJsales)
[1] 461.3769
> sd(BJsales)
[1] 21.47969
方差是由统计学家规定的专门用于度量数据集分散程度的统计量,它的计算公式是
n
x x
n
1 i
2
i ∑ =
( )
,其中
x代表数据集的均值,n 则是数据集中数据的个数,在样本数据中为
了修正误差,分母也会写成 n–1,而非 n。从计算公式上看,方差计算的是数据集中全
部数据与均值的差方的和除以数据个数的值,这个公式同时受到全体数据的影响,方差
越大,则说明数据集中的数据离均值越远,数据越分散。
var函数能够计算数据集的方差(它默认的分母是n–1),由上述代码可知,BJsales
的方差是461.376 9,这是一个非常大的数,实际上它远远超过了BJsales的数据范围。为
了使度量分散程度的统计量更加易读,对方差进行开方即可得到数据集的标准差。sd函
数直接计算出了BJsales的标准差,显然,它和方差具有一个平方关系。标准差要比方差
小得多,比较标准差和数据集范围,能够较容易地看出数据的分散程度。
> c(mean(BJsales)-sd(BJsales),mean(BJsales)+sd(BJsales))
[1] 208.4983 251.4577
上述代码计算了BJsales中均值和方差的差值与和值,这两个数值恰好落在BJsales的
极值之间,实际上无论哪个数据集,均值和方差的差值与和值总是落在极值之间。比较差
值、和值与两个极值的差,如果差较大,数据就较集中;如果差较小,数据就较分散,观
察差值、和值与数据集的两个四分位数是否相似也能得出同样的结果。
除与数据集的其他内部数据进行比较外,方差和标准差也能和其他数据集的方差和
标准差进行比较。需要注意的是,方差和标准差的大小受量纲的影响,如果数据集中的
数据本来就比较大,那么方差和标准差也会比较大;如果数据集中的数据本来就比较小,那么方差和标准差也会比较小。因此不同量纲之间的方差和标准差是不能直接相比的,在比较前需要先对数据集进行标准化。29
第2章 原始数据的探索与预处理
2.2.2? 标准误和偏度系数、峰度系数
除极值、方差和标准差外,还有一些其他的统计量也可以用于度量数据的分散程度。
R 中并未为这些统计量一一编写现成的函数,有些统计量在使用时需要我们自己编写公
式进行计算,比如标准误、偏度系数、峰度系数就是三个需要用户自己编写公式的实用
统计量。
> error <- sqrt(var(BJsales)length(BJsales))
> error
[1] 1.753809
上述代码计算了 BJsales 的标准误。标准误的计算公式为
1 nn
xx
n
1 i
2
i ∑ =
( )
( )
,很明显,其中,1 n
xx
n
1 i
2
i ∑ =
( )
就是 var 函数的计算公式。因此只需计算 var 函数值与 BJsales 中数
据个数的差的开方,即可得到标准误。上述代码中第 1 行代码使用 length 函数计算了
BJsales 中数据的个数,并用 sqrt 函数实现了开方,由返回结果可知,BJsales 的标准误
为 1.753 809。
标准误和标准差是两个不同的概念,标准误的计算公式可简化为
n
s
,这与标准差
的公式显然不一样,标准误在标准差的基础上消去了数据量带来的影响,对数据量相差
较大的多个数据集来说,标准误更具有比较意义。
> skewness<-length(BJsales)sum((BJsales-mean(BJsales))^3)
+ ((length(BJsales)-1)(length(BJsales)-2)sd(BJsales)^3)
> skewness
[1] 0.2858044
偏度系数和峰度系数是两个衡量数据集的分布形状的系数。偏度系数的计算公式为
3
n
1 i
3
i
s 2 n 1 n
xxn
∑ =
( )
( ) ( )
,其中,s 代表数据集的标准差。这是一个很复杂的公式,上述代码使用
length 函数、sum 函数、mean 函数、sd 函数等多个函数完成了复杂的计算过程,R的返回结果显示BJsales 的偏度系数为 0.285 804 4。
偏度系数是一个取值通常在 –3~+3 之间的值,它衡量了数据集的对称程度。数据越
对称,偏度系数就越接近 0;数据越不对称,偏度系数就越远离 0。BJsales 的偏度系数
是正的,这表明BJsales 的右侧数据更分散,否则,它的偏度系数将是负的。
> m<-mean(BJsales)
> n<-length(BJsales)
> s<-sd(BJsales)
30
R 语言与大数据编程实战
> kurtosis<-(n(n+1)sum((BJsales-m)^4))((n-1)(n-2)(n-3)s^4)-
(3(n-1)^2((n-2)(n-3)))
> kurtosis
[1] -1.526321
峰度系数的计算公式更为复杂,3 n 2 n
1 n 3
s 3 n 2 n 1 n
x x 1 n n 2
4
n
1 i
4
i
× ∑ =
( )
( )( )
( )
( ) ( )
( )
( )
是它的具体表达形式,为了减少编程量,上述代码中首先设置了三个辅助变量,而后使用这三个辅助变量进行
了计算。显然,这种编程方式的易读性更强,写起来也更方便。
由 R 的返回结果可知,BJsales 的峰度系数为 –1.526 321。峰度系数由数据集的四
阶矩计算得到,正态分布的峰度系数为 3,不过上述代码的计算公式中已减去 3,因此,只需将峰度系数与0 进行比较即可得知数据集的分布峰度与正态分布的相似程度。峰度
系数越接近 0,数据集的分布峰度就与正态分布越相似;峰度系数越远离0,数据集的
分布峰度就与正态分布越不相似。BJsales 的峰度系数为负,这表明 BJsales 中的数据较
为集中,两侧数据较少 ;否则,BJsales 的峰度系数将为正。
正态分布具有良好的性质,因此我们总是希望数据集的分布尽可能地接近正态分布。
偏度系数和峰度系数就是这样两个实用的函数,显然,当偏度系数和峰度系数都为0 时,数据集就服从一个标准的正态分布。
除标准误、偏度系数、峰度系数外,还有极差、变异系数、样本校正平方和等许多
有用的统计量,其中的大部分统计量 R 都没有为它们提供单独的函数,我们在使用这些
统计量时可以自己编写函数,或者安装 R 中附带了这些函数的包。另外,有些数值摘要
表中提供了这些统计量,也可以从数值摘要表中查询统计量的值。
2.3 创建一个数值摘要表
之前两个小节介绍了好几种在探索数据时常用的统计量,这些统计量共同刻画出数
据的大致轮廓,自然的,如果有一个函数能够将这些统计量汇总起来,这将创造极大的
方便。实际上,这种函数已经存在于R中,它们能够创建包含多个统计量的数值摘要表,为了展示数据汇总函数在数据框上的效果,本节使用attenu数据集作为示例。
> library(datasets)
> head(attenu)
event mag station dist accel
1 1 7.0 117 12 0.359
2 2 7.4 1083 148 0.014
3 2 7.4 1095 42 0.196
4 2 7.4 283 85 0.135
5 2 7.4 135 107 0.062
6 2 7.4 475 109 0.054
在 R 中加载 dataset 包后,attenu 数据集即可直接调用。attenu 是一个与 Joyner-31
第2章 原始数据的探索与预处理
Boore 衰变系数有关的数据集,使用 head 函数查看 atteun 的前 6 行数据,由 R 的返回
结果可知 attenu 中有 5 个变量,其中,event 存储了事件标签信息,mag 存储了镁信息,station存储了观察站点信息, dist存储了距离信息, accel存储的则是时间调整信息。显然,它们都是数值型的。
> ?venum(attenudist)
[1] 0.5 11.1 23.4 47.7 370.0
> summary(attenu)
event mag station dist
Min. : 1.00 Min. :5.000 117 : 5 Min. : 0.50
1st Qu.: 9.00 1st Qu.:5.300 1028 : 4 1st Qu.: 11.32
Median :18.00 Median :6.100 113 : 4 Median : 23.40
Mean :14.74 Mean :6.084 112 : 3 Mean : 45.60
3rd Qu.:20.00 3rd Qu.:6.600 135 : 3 3rd Qu.: 47.55
Max. :23.00 Max. :7.700 (Other):147 Max. :370.00
NA's : 16
accel
Min. :0.00300
1st Qu.:0.04425
Median :0.11300
Mean :0.15422
3rd Qu.:0.21925
Max. :0.81000
R 提供了两个基础的数值摘要表函数: ?vesum 函数和 summary 函数。其中
venum 函数只作用于向量,summary 函数既可以作用于向量,也可以作用于数据
框。上述代码对 attenu 中的 dist 向量应用了 ?venum 函数,对 attenu 应用了 summary
函数。?venum 函数返回了向量的两个极值、两个四分位数和均值。该函数能够实现与
quantile 函数相同的效果,但?venum 函数的执行速度要快一些。summary 函数的返
回结果在 ?venum函数的基础上增加了一个中位数统计量。
R 控制台返回了 event、mag、dist 和 accel 变量的 6 个统计量,在 station 变量下则
返回了一些其他数值。这是由于 station 是一个因子变量,因此 summary 函数返回了
station 中出现次数最多的 5 个因子,并注明了其他因子总共出现了多少次,以及空缺值
的个数。在 R 控制台中输入 class(attenustation)可以查看 station 的类型,输入 ?factor可
以获取有关因子类型的更多信息。
> alldata <- function(x){
+ var <- var(x)
+ sd <- sd(x)
+ med ......
李倩星 编著
高级大数据人才培养丛书
内 容 简 介
本书是一本 R 语言入门读物,它旨在帮助读者迅速构建起与数据分析相关的知识体系,并学习如
何使用 R 软件实现数据分析方法。无论有无深厚的编程基础或数学基础,本书都能帮助读者成长为一
名合格的数据分析师。
本书全面介绍了来自统计分析、机器学习、人工智能等领域的多种数据分析算法,在讲解与之相
关的R代码时,还讨论了这些算法的原理、优缺点与适用背景。本书按照由易到难的原则组织章节主题,读者将获得最好的阅读体验。通过阅读本书,读者将对R语言在数据分析领域的应用有一个全面的认识。
这种认识不被特定行业所局限,任何行业的读者都能利用本书介绍的数据分析方法解决本行业的数据
分析问题。
未经许可,不得以任何方式复制或抄袭本书之部分或全部内容。
版权所有,侵权必究。
图书在版编目(CIP)数据
R 语言与大数据编程实战 李倩星编著. —北京:电子工业出版社,2017.9
(高级大数据人才培养丛书)
ISBN 978-7-121-32634-9
Ⅰ . ① R… Ⅱ. ①李… Ⅲ. ①程序语言-程序设计Ⅳ. ①TP312
中国版本图书馆 CIP 数据核字(2017)第 215708 号
策划编辑:李? 冰
责任编辑:李? 冰
特约编辑:彭? 瑛? 赵海军等
印 刷:三河市华成印务有限公司
装 订:三河市华成印务有限公司
出版发行:电子工业出版社
北京市海淀区万寿路173信箱 邮编:100036
开 本:787×1092 116 印张:20 字数:512千字
版 次:2017年9月第1版
印 次:2017年9月第1次印刷
定 价:59.00元
凡所购买电子工业出版社图书有缺损问题, ?请向购买书店调换。 ?若书店售缺, ?请与本社发行部联
系, ?联系及邮购电话 : ? (010) 88254888, 88258888。
质量投诉请发邮件至zlts@phei.com.cn,盗版侵权举报请发邮件至dbqq@phei.com.cn。
本书咨询联系方式 : ?libing@phei.com.cn。前 言
R 语言是如今最热门的编程语言之一,它由统计学家开发,在解决数据分析问题时
具有先天优势。R语言是一门新兴的语言,掌握它,就是掌握了一门高效的数据分析软件。
随着大数据概念的普及,R 语言能够实现的功能越来越丰富,越来越多的数据分析从业
人员产生了学习 R 语言的需求。本书迎合时代潮流,讲解了大数据时代下 R语言渗透最
广泛的几个领域,全面介绍了如何使用 R 语言完成数据挖掘工作。对 R语言编程人员来
说,本书是一本不可或缺的工具书。
本书特色
1. 通俗易懂、实用性强,适合各层次读者学习
本书对读者的数学基础或编程基础不做任何要求。在讲解知识点时,本书采用了平
实的语言,对每个疑难点都加以详细解释。此外,本书以实用为主旨,秉承“看得懂、学得会、用得上”的编写原则,精心选取了流行于行业前沿的 18 个主题,不仅通俗易懂,还确保读者所学的知识具有实际应用价值。通过阅读本书,读者都能迅速掌握 R 语言的
编程技巧及相关的数据分析知识,并在实际工作中立刻应用它们。
2. 条理清晰、结构巧妙,全面盘点数据分析常用算法
数据分析是一个涉及多领域的交叉学科,R 软件的触角同样也能伸展到多个领域。
本书选取了统计分析、机器学习、人工智能等多个学科的流行算法作为主题,讲解了如
何使用 R 语言实现它们。这些算法有些偏重数学思维,有些偏重编程技巧,本书主要遵
循由易到难的顺序排列主题,并尽量把起源于同一学科的算法放在一起。读者可以按照
顺序阅读本书,也可以优先选择感兴趣的部分。此外,本书还穿插介绍了与 R 软件相关
的一些其他编程主题,这些主题共同形成知识网络,帮助读者迅速成长为能够独当一面
的数据科学家。
3. 知识点丰富、可拓展性强,满足读者的多重需求
本书涉及多个学科,全面介绍了 R 软件能够实现的多种算法,满足了读者的三大需
求:首先,使用通俗易懂的语言介绍 R 软件,帮助读者实现零基础入门;其次,囊括多
种数据分析算法,带领读者全面认识 R 软件的强大之处,帮助读者成长为合格的数据科
学家;最后,本书具备较强的可拓展性,从事任何行业的读者都能够从本书中获取适合
其行业的知识。本书还给出了 R 语言进阶的线索,无论想向哪一方面进阶,本书都能为
读者打造最坚实的基础。
IV
R 语言与大数据编程实战
本书内容及体系结构
本书总共 18 章,分别为R 的基本介绍、原始数据的探索与预处理、R 的数据可视化、R 中参数的估计和检验、R 中的方差分析、R 中的相关分析和回归分析、更高级的数据
可视化、R 中的聚类分析和判别分析、R 中的主成分分析和因子分析、R 中的广义线性
回归模型、R 中的时间序列模型、R 中的最优化问题、使用 R 绘制地理信息图形、使用
R 构建支持向量机、实现更高效的流程控制和高级循环、R 代码的调试与优化、构建电
影评分预测模型、贝叶斯垃圾邮件过滤器模型。这18 章进一步又分为 5 个部分。
第一部分为本书的第1~6 章。其中前 3 章展示了R 软件的一些入门功能,如数据预
处理和数据可视化等,后 3章则介绍了三种基础的统计分析方法,即参数的估计和检验、方差分析、相关分析、回归分析。这6 章围绕初级的统计方法展开,是数据分析师必备
的基本知识。
第二部分为本书的第 7~11 章,这 5 章介绍了更高级的统计方法。其中,第 7 章为
第 3 章的延伸,介绍了数据可视化的高级方法,第 8~11 章则介绍了 6 种高级统计分析
方法,这部分的内容与第一部分互为补充。
第三部分为本书的第 12~14 章,这部分内容围绕机器学习展开。第 12 章的主题为
最优化,是机器学习的基本理论。第 13 章介绍了如何使用矢量化的思想绘制地图。第
14 章则介绍了支持向量机,它是最典型的机器学习算法之一。这部分讲解了更高深的 R
语言编程技巧,讨论了一些R 软件能够解决的高难度问题。
第 15、16 章可视为本书的第四部分。这两章围绕如何优化 R 代码展开,系统地讨
论了如何写出错误较少的、运行速度较快的代码。这部分内容帮助读者建立良好的编程
习惯,以及与其他 R用户更好地协同工作。
第 17、18 章则为本书的最后一部分,这两章分别讨论了一个完整的数据挖掘项目。
其中电影评分预测的案例着重于表现数据挖掘的完整流程,包括繁复的数据预处理与反
复的模型比较等工作;垃圾邮件过滤的案例则引出 R 软件能够处理的另一个主题——文
本分析。
上述划分方法仅为一个参考,本书的 18 章既互相联系又彼此独立,读者可按照上
述划分方法阅读本书,也可优先阅读某些章节,如将第 3、7、13 章等与数据可视化相
关的三个章节放在一起阅读。
本书读者对象
y 想要了解R语言的数据分析从业人员。
y 统计学、金融学、计算机技术与科学等专业的学生。
y 想要提高R语言编程能力的数据分析师。
y 希望系统学习统计分析方法的从业人员。
y 其他对 R 语言有兴趣的各类人员。目 录
第 1章 R的基本介绍 .................................................................................................1
1.1 强大的 R ....................................................................................................................1
1.2 R 语言在大数据中的应用 ........................................................................................2
1.2.1 R 语言用户行为分析 .....................................................................................2
1.2.2 R 语言处理金融大数据 .................................................................................3
1.2.3 R 语言天气数据可视化 .................................................................................4
1.2.4 R 语言医疗大数据分析 .................................................................................4
1.3 R 的安装与启动 ........................................................................................................5
1.3.1 安装并启动 R .................................................................................................6
1.3.2 安装并启动一个 IDE .....................................................................................7
1.4 R 的向量、矩阵和数组 ............................................................................................8
1.4.1 向量的操作方法和固有属性 ........................................................................8
1.4.2 矩阵的操作和运算 ......................................................................................10
1.4.3 数组中的维度函数 ......................................................................................13
1.5 R 的列表和数据框 ..................................................................................................14
1.5.1 列表的特性和编辑方法 ..............................................................................14
1.5.2 数据框的创建和基本操作 ..........................................................................17
1.6 R 数据文件的载入和载出 ......................................................................................19
1.6.1 结构化纯文本文件的读取和输出 ..............................................................19
1.6.2 其他文件的读取和输出 ..............................................................................22
1.7 向 R 中安装包 .........................................................................................................23
第2章 原始数据的探索与预处理 .............................................................................26
2.1 度量数据集的集中程度 ..........................................................................................26
2.2 度量数据集的分散程度 ..........................................................................................27
2.2.1 极值、方差和标准差 ..................................................................................27
2.2.2 标准误和偏度系数、峰度系数 ..................................................................29
VI
R 语言与大数据编程实战
2.3 创建一个数值摘要表 ..............................................................................................30
2.4 异常值的观测与说明 ..............................................................................................32
2.4.1 利用箱线图观测异常值并处理 ..................................................................32
2.4.2 异常值检测的其他情况和说明 ..................................................................34
2.5 缺失值的填补与处理 ..............................................................................................35
2.5.1 删除缺失值或对其进行简单填补 ..............................................................36
2.5.2 按照相关性对空缺值进行填补 ..................................................................38
第3章 R 的数据可视化 ...........................................................................................40
3.1 plot 函数和常用的图形参数 ................................................................................40
3.1.1 设置 plot 函数中的参数 ...........................................................................40
3.1.2 修改散点图的坐标并加入标注 ..................................................................43
3.2 经典的基础图形及用途 ..........................................................................................45
3.2.1 线图 ..............................................................................................................45
3.2.2 直方图 ..........................................................................................................49
3.2.3 箱线图和茎叶图 ..........................................................................................52
3.3 将图形组合起来 ......................................................................................................55
3.4 更多的高水平作图函数 ..........................................................................................57
3.5 更多的常用作图命令 ..............................................................................................59
第4章 R 中参数的估计和检验 .................................................................................62
4.1 使用R进行点估计和区间估计 .............................................................................62
4.1.1 简单的点估计和区间估计 ..........................................................................62
4.1.2 估计单侧置信区间 ......................................................................................65
4.2 与正态总体有关的参数检验 ..................................................................................68
4.3 列联表与独立性检验 ..............................................................................................71
4.4 几种检验数据分布的函数 ......................................................................................72
4.5 对非正态总体的区间估计和检验 ..........................................................................75
4.5.1 非正态总体的区间估计 ..............................................................................75
4.5.2 非参数检验中的符号检验 ..........................................................................76
4.5.3 非参数检验中的秩检验 ..............................................................................78VII
目 录
第 5章 R中的方差分析 ...........................................................................................80
5.1 方差分析模型的建立 ..............................................................................................80
5.2 单因素方差分析 ......................................................................................................81
5.2.1 单因素方差分析的数学思想与模型 ..........................................................81
5.2.2 检验样本是否满足方差分析的假设条件 ..................................................82
5.2.3 构建单因素方差分析模型 ..........................................................................84
5.3 多因素方差分析 ......................................................................................................87
5.3.1 多因素方差分析的数学思想与模型 ..........................................................87
5.3.2 不考虑交互作用的双因素方差分析 ..........................................................88
5.3.3 考虑交互作用的双因素方差分析 ..............................................................89
5.4 秩检验和协方差分析 ..............................................................................................91
5.4.1 对控制变量应用秩检验方法 ......................................................................91
5.4.2 协方差分析的假设与应用 ..........................................................................92
第6章 R中的相关分析和回归分析 .........................................................................94
6.1 多种相关系数的度量和分析 ..................................................................................94
6.1.1 简单相关系数的计算和检验 ......................................................................94
6.1.2 散布矩阵图和偏相关系数 ..........................................................................96
6.1.3 典型相关分析 ..............................................................................................98
6.2 线性回归分析及其常规参数 ..................................................................................99
6.2.1 对数据进行预处理 ....................................................................................100
6.2.2 构建第一个回归模型 ................................................................................101
6.2.3 修正方程并检验残差 ................................................................................102
6.3 使用逐步回归筛选自变量 ....................................................................................104
6.3.1 逐步回归的思想与分类 ............................................................................104
6.3.2 构建逐步回归模型 ....................................................................................105
6.4 哑变量和逻辑回归 ................................................................................................107
6.4.1 哑变量和逻辑回归的思想 ........................................................................107
6.4.2 向线性回归模型中纳入哑变量 ................................................................108
VIII
R 语言与大数据编程实战
第 7章 更高级的数据可视化 .................................................................................. 110
7.1 基础图形的拓展与延伸 ........................................................................................110
7.1.1 绘制分类散点图并添加图标 ....................................................................110
7.1.2 绘制含多种类别的密度分布图 ................................................................112
7.1.3 复合条形图和堆栈条形图 ........................................................................114
7.2 有关多元分布函数的特殊图形 ............................................................................117
7.2.1 星图和脸谱图 ............................................................................................117
7.2.2 轮廓图 ........................................................................................................120
7.2.3 调和曲线图 ................................................................................................122
7.3 建立最简单的3D图形 .........................................................................................123
7.4 如何让图形更美观 ................................................................................................125
7.5 更多的绘图包和系统 ............................................................................................128
第8章 R 中的聚类分析和判别分析 .......................................................................129
8.1 几种聚类分析的异同 ............................................................................................129
8.2 使用R实现KNN 聚类 ........................................................................................130
8.2.1 KNN算法的思想和模型 ...........................................................................130
8.2.2 使用R实现 KNN 聚类 .............................................................................131
8.3 使用 R 实现系统聚类 ...........................................................................................133
8.3.1 系统聚类的思想和模型 ............................................................................133
8.3.2 使用R实现系统聚类 ................................................................................134
8.4 使用 R 实现快速聚类 ...........................................................................................136
8.4.1 快速聚类的思想和模型 ............................................................................136
8.4.2 使用R实现快速聚类 ................................................................................137
8.5 几种判别分析模型综述 ........................................................................................140
8.5.1 距离判别模型 ............................................................................................140
8.5.2 Fisher判别模型 .........................................................................................142
第 9章 R 中的主成分分析和因子分析 ....................................................................145
9.1 主成分分析的实现与应用 ....................................................................................145
9.1.1 主成分分析的模型假设和数据处理 ........................................................145
9.1.2 构造一个主成分分析模型 ........................................................................147IX
9.1.3 计算主成分的综合得分 ............................................................................149
9.2 因子分析的初次构建与完善 ................................................................................150
9.2.1 构造一个简单的因子分析模型 ................................................................150
9.2.2 计算因子得分并分析 ................................................................................152
9.3 对因子分析模型进行修正 ....................................................................................153
9.3.1 修改因子分析模型中的因子个数 ............................................................153
9.3.2 基于主成分法和主轴因子法进行因子分析 ............................................155
9.4 在降维分析的基础上进行回归分析和聚类分析 ................................................157
9.4.1 在降维分析的基础上进行回归分析 ........................................................157
9.4.2 在降维分析的基础上进行聚类分析 ........................................................160
第10章 R 中的广义线性回归模型 ........................................................................162
10.1 一般的广义线性回归模型 ..................................................................................162
10.1.1 使用二次函数拟合线性回归模型 ..........................................................162
10.1.2 拟合更多的广义线性模型 ......................................................................164
10.1.3 比较线性模型的优劣 ..............................................................................166
10.2 Logistic线性回归模型 ........................................................................................168
10.2.1 Logistic模型的原理与构建方法 ............................................................168
10.2.2 Logistic模型的显著性检验和优势比 ....................................................170
10.2.3 修正被警告的 Logistic模型 ...................................................................171
10.3 泊松回归分析模型 ..............................................................................................173
10.3.1 拟合第一个泊松回归模型 ......................................................................174
10.3.2 泊松回归模型的过散布检验 ..................................................................176
10.4 广义线性模型的交叉验证 ..................................................................................178
第 11章 R中的时间序列模型 ...............................................................................180
11.1 将数据转换为时间序列格式 ..............................................................................180
11.1.1 使用ts 函数转换数据格式并绘制时间序列曲线 ...............................180
11.1.2 使用zoo 函数转换数据格式并绘制时间序列曲线 ............................182
11.2 分解时间序列并检验时间序列的自相关性 ......................................................185
11.2.1 使用经典方法分解时间序列 ..................................................................185
11.2.2 使用STL 方法分解时间序列 .................................................................186
目 录
X
R 语言与大数据编程实战
11.3 探究时间序列的自相关性 ..................................................................................188
11.3.1 使用月图和季度图探究自相关性 ..........................................................188
11.3.2 使用散点图探究自相关性 ......................................................................189
11.4 构建时间序列并预测 ..........................................................................................191
11.4.1 均值预测、单纯预测和漂移 ..................................................................192
11.4.2 不考虑长期趋势和季节波动的简单指数平滑 ......................................195
11.4.3 在指数平滑中加入长期趋势和季节波动 ..............................................196
11.4.4 自回归移动平均模型 ..............................................................................198
第12章 R中的最优化问题 ..................................................................................201
12.1 最优化问题简述 ..................................................................................................201
12.2 黄金分割法 ..........................................................................................................202
12.2.1 黄金分割法和局部最优解 ......................................................................202
12.2.2 使用 R实现黄金分割法 ..........................................................................203
12.3 牛顿最优化方法 ..................................................................................................205
12.3.1 牛顿法的算法原理 ..................................................................................206
12.3.2 在一维情形下实现牛顿迭代法 ..............................................................207
12.3.3 在多维情形下实现牛顿迭代法 ..............................................................209
12.4 最快上升法 ..........................................................................................................210
12.4.1 利用梯度求解上升最快的相邻点 ..........................................................210
12.4.2 构建最快上升法函数并检验 ..................................................................212
12.5 R中的最优化函数 ..............................................................................................213
第13章 使用 R绘制地理信息图形 .......................................................................216
13.1 绘制世界、国家、省市地图 ..............................................................................216
13.1.1 使用 map 函数绘制地图 .......................................................................216
13.1.2 另一种绘制地图的方法 ..........................................................................217
13.1.3 分省市绘制地图 ......................................................................................218
13.2 向地图中添加颜色 ..............................................................................................220
13.2.1 向地图中添加颜色前的准备工作 ..........................................................220
13.2.2 在地图上添加颜色 ..................................................................................221
13.3 向地图中添加标签和线条 ..................................................................................222
13.3.1 向地图中添加标签前的准备工作 ..........................................................222XI
13.3.2 在地图上添加标签 ..................................................................................224
13.3.3 在地图上添加线条 ..................................................................................225
13.4 使用其他格式的文件优化地图 ..........................................................................226
第14章 使用 R 构建支持向量机 ..........................................................................230
14.1 构建一个简单的支持向量机 ..............................................................................230
14.1.1 支持向量机的算法原理 ..........................................................................230
14.1.2 构建一个简单的支持向量机 ..................................................................232
14.1.3 使用其他核函数构建支持向量机 ..........................................................235
14.2 优化支持向量机的参数 ......................................................................................237
14.2.1 优化参数degree .......................................................................................238
14.2.2 优化参数cost ...........................................................................................241
14.2.3 优化参数gamma .....................................................................................243
14.3 比较支持向量机与 Logistic回归的优劣 ...........................................................246
14.4 比较支持向量机和 KNN 聚类算法的优劣 .......................................................249
第 15章 实现更高效的流程控制和高级循环 .........................................................251
15.1 R 中的流程控制 ..................................................................................................251
15.1.1 if 语句的多种实现方法 ...........................................................................251
15.1.2 ifelse 语句与花括号的结合 .....................................................................252
15.1.3 适合多分支情况的 switch 语句 ..............................................................254
15.2 R 中的for 循环、while 循环和 repeat循环 ......................................................256
15.2.1 R 中的 for 循环和 while循环 .................................................................256
15.2.2 R 中的 repeat循环 ...................................................................................258
15.3 apply 家族中的循环函数 ....................................................................................260
15.3.1 R 中的 apply 函数 .................................................................................260
15.3.2 R 中的 lapply 函数和sapply函数 .....................................................263
15.3.3 R 中的 tapply 函数 ................................................................................265
15.3.4 R 中的 mapply 函数 ..............................................................................268
15.4 更多的高级循环函数 ..........................................................................................270
15.4.1 R 中的 replicate函数和sweep函数..................................................270
15.4.2 R 中的 aggregate函数 ..........................................................................273
目 录
XII
R 语言与大数据编程实战
第 16章 R代码的调试与优化 ...............................................................................276
16.1 R 代码的常见信息与警告 ..................................................................................276
16.1.1 R 代码的正常信息与警告 .......................................................................276
16.1.2 R代码中的警告处理方法 .......................................................................278
16.2 R代码中的错误与错误处理方法 ......................................................................279
16.2.1 使用 try 函数处理错误信息 .................................................................279
16.2.2 将 try函数与循环相结合 .....................................................................281
16.3 调试 R代码 .........................................................................................................282
16.3.1 查看调用栈或暂停代码 ..........................................................................282
16.3.2 修改 error选项 ........................................................................................284
16.4 向量化编程方法 ..................................................................................................285
16.4.1 向量化编程思想 ......................................................................................285
16.4.2 比较循环和向量的运行速度 ..................................................................286
第17章 构建电影评分预测模型 ...........................................................................289
17.1 获取数据并探索 ..................................................................................................289
17.2 利用 recommenderlab包处理数据 .....................................................................291
17.3 建立模型并评估 ..................................................................................................293
17.3.1 模型的选择与建立 ..................................................................................293
17.3.2 模型之间的比较和评估 ..........................................................................295
第18章 贝叶斯垃圾邮件过滤器模型 ....................................................................297
18.1 贝叶斯模型中的条件概率 ..................................................................................297
18.2 复杂的数据预处理过程 ......................................................................................298
18.2.1 利用 for 循环读入多封邮件正文 ............................................................298
18.2.2 利用 tm 包进一步转换数据格式 ............................................................300
18.2.3 将 TDM转换成真正有用的数据框 .......................................................301
18.3 利用 occurrece值构造分类器 ............................................................................303
18.3.1 完成理论准备并处理测试邮件和普通邮件 ..........................................303
18.3.2 创建一个函数用于比较概率 ..................................................................305第 1章 R的基本介绍
作为一门新兴的编程语言,R 是如今值得学习的语言。由统计学家开发出的 R 语言
具有许多奇特性质,本章将较为全面地介绍 R 的特性和用途,并讲解 R 的安装方法、变
量类型、从其他数据源读取数据、程序包等基本知识。本章帮助读者对 R 形成整体印象,同时本章内容也是后续章节的基石。
1.1 强大的 R
R语言脱胎于 S 语言,是一门专门用于处理数据探索、统计分析等任务的编程语言。
它由统计学家开发完成,在数据分析方面具有天然的优势,运行 R 程序的 R软件是如今
最流行的统计软件之一。
与其他统计软件相比,R 软件最特别的地方在于它是开源的。这同时意味着:第一,R 是免费的;第二,R 的用户能够自由地参与到 R 的开发中。R 社区将它的忠实用户聚
合在一起,这些用户主要由统计学家、计算机学家、数据分析师等组成,不同领域的用
户在 R社区中交流碰撞,协助 R 核心团队丰富和完善R 的功能。
R 的用户之间具有非常紧密的联系,他们最大的贡献是创建了形形色色的程序包,这些程序包分别封装了一些具有特定作用的函数。如今,R软件已经内置了非常丰富的
各类函数库,能够满足绝大多数统计人员的各类需求,它的制图功能也远超其他统计软件。
R 的另一个特点在于它支持混合型的编程范式。R 是一种解释型的语言,当用户在
R 软件中编写好一条代码后,R 会立即执行它。这种做法的好处在于用户可以即时地看
到程序的返回结果,在作图时尤其方便。R 是一种面向对象的语言,同时它也支持函数
式编程,即用户可以在 R 中调用现成的或自己编写的函数,这一点与 C 语言较为相似,但 R要比 C语言更加灵活。
尽管 R 的优点很突出,但它也同样具有局限之处。首先,R 语言的编程原理较为
传统,在处理数据时,R 需要将数据全部载入内存,这一点极大地影响了 R 的运行效
率,尽管如今的计算机内存做得越来越大,但在有些大规模数据集的处理工作中,R 还
是会显得不够得力。其次,R 软件的保密性不如 SAS 等统计软件好,这限制了 R 在大
型商业项目中的应用。最后,由于 R 软件是由统计学家开发的,因此其语法设计并不特
别严谨,有时它会出现一些奇怪的错误。
随着大数据时代的到来,R语言正被越来越多的人关注,不仅是统计分析和数据挖掘,一些研究机器学习和模式识别的专家同样关注到R的发展。根据TIOBE提供的编程语言
排行榜,R语言的流行程度在近几年内已经飙升至前十名,其火爆程度只有Python才能与
其比肩,而同为统计软件的SAS和MATLAB则一直徘徊于二三十名的位置。
2
R 语言与大数据编程实战
R的优点使它广泛地流行于统计人员和中小型商业公司中。Google、百度等互联网
巨头则将 R 语言看作一个沙盘,使用软件验证各种数据模型的可行性,并最终使用其他
语言实现。随着 R 的用户越来越多样化,其可扩展能力进一步强化,能够解决的问题也
越来越丰富。如今,金融、医药、教育、社会科学等每一个需要数据分析的领域都需要
精通 R 的人才。
1.2 R语言在大数据中的应用
R 语言的起源是统计学家为解决数据分析领域问题而开发的语言,所以和
MATLAB、Python 等可用于数据处理的语言相比,在数据分析处理方面具有一些独特优
势,本节将讲述 R语言在大数据领域中的典型应用。
1.2.1? R语言用户行为分析
近几年,淘宝、京东等几家电商的价格战打得不亦乐乎,而从电商发布的战果来看,几败具伤的价格战已经无法保证电商的利润,他们开始转向利用大数据分析工具对用户
行为进行分析,通过对大数据的充分使用和挖掘在商战中获胜。
何为“用户行为分析”?简单的理解就是对用户在网站上发生的所有行为进行分析,找到里面的规律和用户感兴趣的信息。这些行为如搜索商品信息、浏览新闻、购物评价
和打分、美团点评、加入收藏列表、加入购物车、购买、使用特价购物券、换货和退货
等;除此之外,还包括在第三方网站上的相关行为分析,如比价、看相关评测、参与讨论、社交媒体上的交流、与好友互动等。电子商务的突出特点就是可以通过后台收集到大量
客户在购买前的行为信息,而这些信息对于分析用户行为至关重要。
全球电子商务的创始者之一亚马逊公司结合大数据分析工具,以迅雷不及掩耳之势,彻底颠覆了很多行业的市场规则及竞争关系。亚马逊取胜的根本原因在于对数据的战略
性认识和使用,亚马逊通过传统门店无法比拟的互联网手段,获取了极其丰富的用户行
为信息,并且进行深度分析与挖掘。
电商通过对用户行为的分析,可以制定更加贴心的服务。例如,当客户浏览了多款
手机而没有做购买的行为时,系统会把适合客户的品牌、价位和类型的多款手机信息推
送到客户的账户,只要客户登录系统,就可以看到这些推送信息。这样的个性化推荐服
务往往会起到非常好的效果,不仅可以提高客户购买的意愿,缩短购买的路径和时间,还可以在比较恰当的时机捕获客户的最佳购买冲动,提升用户体验,是一个一举多得的
好方式。
在电商领域中,用户的行为信息量之大令人难以想象,据不完全统计,用户在电商
网站购买一个商品前,平均会浏览 3 ~ 5 个网站(淘宝、京东、1 号店等)、30 ~ 36 个
页面,统计起来对于一个一天有近百万访问量的中型电商,一天就会有1TB 左右的活跃
数据。
除了电商,爱奇艺、优酷、土豆网等各类视频网站已成为人们娱乐和学习的重要平台,视频网站成功与否的最重要衡量标准就是用户的满意度。由于Web 应用能够以很细的粒3
第1章 R 的基本介绍
度、很高的频度不断记录用户的行为轨迹,这些数据中隐藏着用户的访问习惯、兴趣偏
好及情绪变化等信息,同时也隐含着用户群体行为的规律和发展趋势。挖掘深藏在数据
背后的知识,能够发现用户习惯的观看流程,访问网站的时间及喜好的视频,各视频间
存在的关联关系等。掌握了这些知识,就能科学解决用户跳出等问题,根据用户访问习
惯改进网站服务流程,以及针对用户进行个性化服务,变革传统的网站管理和运营模式,主动提升用户的体验以促进视频网站的快速发展。
综观国内外成功的电商和视频网站等互联网企业,对用户行为信息的分析和使用,无不在这个必争之地做了大量投入。他们对数据战略性的高度认识和使用,非常值得国
内的电商学习和借鉴。
R语言作为能够进行交互式数据分析和探索的强大平台,具备一套完整的数据处理、计算和制图软件系统,在电商用户行为数据分析和挖掘领域应用广泛。基于 R 语言对视
频网站的用户在线行为数据进行分析挖掘,通过对采集到的用户行为数据进行引流指标、黏性指标的分析和挖掘,可以得到网页被访问的频繁度、停留时间、用户观看视频的喜
好等信息。将分析的结果应用到网站运营与管理中,不仅能够为网站个性化服务、精准
推销和开发新型业
务模式提供技术和理论支撑,而且能够把握当前网络关注的热点问题,从而正确引
导用户的网络舆论方向。
1.2.2? R语言处理金融大数据
最近几年,数据分析方法在商业和金融市场上的重要性持续增加,因为我们有丰富
的数据环境,经济和金融市场的数据相比以前更加综合和完整,在许多国家成百上千个
变量的数据可以更系统、更精确地搜集,计算处理上的便利和统计软件包的使用使得对
复杂的高维金融数据的分析成为可能,通过互联网可以很容易地应用开源软件包下载公
开的金融数据,如 R 语言和软件开发环境,所有这些软件的特性和功能免费公开,因而
被广泛使用。
2008 年的金融危机在某种程度上是由错误的金融模型造成的,既有模型过于简单的
原因,又有模型过于复杂的原因,房地产经纪人和买家依赖于一个隐式模型,它表明价
格已经在高位,且还会继续上涨。贷款人使用统计模型来对打包的按揭产品进行分析设
计,这似乎可以奇迹般地降低风险,然而最后的结果是灾难性的,在 4 年之后仍然可以
感受到房地产泡沫的影响。
那么,如何进行有用的并且没有危险的金融分析呢?首先应该对金融数据有一个基
本的理解,尤其是时间序列数据,因为不确定性是主要的影响因素,比如可以用概率模
型来描述资产收益率的频率分布,利用时间序列模型对数据进行描述平滑和季节调整。
使用 R 语言进行金融分析时,可以利用 R 语言的优势,研究分析基于 Hadoop 存储
证券的日内交易数据,通过 RHive 连接 R 语言与 Hive,建立相关性算法模型,在历史
数据中回测,构建投资决策组合,并生成可视化结果用于展示。
R语言quantmod包是股市金融建模应用比较多的一个包。该包从多个数据源获取历
史数据,绘制金融数据图表,以及在金融数据图表中添加各种技术指标,通过多种金融
4
R 语言与大数据编程实战
模型分析,辅助股票筛选和判断。该包获取数据的来源主要有两个: Yahoo! 和 Google。
最常用的是Yahoo!中的各种数据。但该包只能获取股票的历史交易记录信息,如最大值、最小值、开盘价、收盘价及成交量。在此基础上利用股票的历史数据,通过 R 语言建立
模型,并对数据进行分析,从模型的检验决定未来的交易行为。
1.2.3? R语言天气数据可视化
R语言天气数据可视化,就是通过获取天气的历史大数据,使用R语言和可视化技术,展示中国每个省份的天气情况,给准备旅游的朋友提供一种出行提示。除了旅游,在传
统零售行业,雨天大概会影响相对于晴天 30% ~ 40% 的销售业绩,所以从网上获取天
气数据进行分析,并根据天气数据做出预测,提前做好预防措施和提醒业务人员,把损
失减少到最低就显得十分重要。要实现天气数据可视化,需要实现的功能和遇到的问题
如下。
y 天气数据 :数据从哪里找到 ;如何下载 ;如何存储。
y 定时任务 :天气数据需要,图片需要每日新生成。
y 地图和天气可视化:要把中国行政区划图和天气数据(包括风力方向可视化)结
合在一起绘图,让用户一眼就能看明白。
y Web 展示:通过可视化技术,我们生成的只是一张静态图片,要如何发布到 Web
端进行展示。
y 微博 :结合新浪微博,让更多的用户看到并使用这个应用。
y 用户交互:用户可以查看不同日期、不同类型的图片,用户还可以通过微博分享。
从上面的描述中,单独使用一种语言不容易实现这些功能。单独用 PHP 开发,做一
个 Web 网站非常容易,连接新浪微博也有现成的 SDK 可以调用,获取数据及存储也不
麻烦,但是如何实现地图和天气数据的可视化?这个是 R 语言的强项,所以,可以将 R
语言和 PHP 语言相结合,发挥 R 语言的优势,用 R 语言的 rvest 包就可以方便获取天气
数据,并实现天气数据的可视化。
1.2.4? R语言医疗大数据分析
医疗大数据是相对于一般数据而言的,指的是人们从医疗系统的软件系统中捕捉大
容量数据,通过大数据分析获得新的认知,从而创造新的价值来源。医疗大数据几乎包
含公民所有个人信息,包括医疗、饮食、住所、旅行登记等。在临床操作方面,有5个
主要场景的大数据应用。根据麦肯锡公司的估计,如果这些应用被充分采用,针对美国
一个国家的医疗健康开支一年就将减少165亿美元。主要场景的大数据应用包括5个方面。
(1)比较效果研究。
通过全面分析病人特征数据和疗效数据,然后比较多种干预措施的有效性,可以找
到针对特定病人的最佳治疗途径。世界各地的很多医疗机构,如德国 IQWIG(德国医疗
质量和效率研究所)、加拿大普通药品检查机构等,已经开始了CER (比较效果研究)项目,并取得了初步成功。5
第1章 R 的基本介绍
(2)临床决策支持系统。
临床决策支持系统可以提高工作效率和诊疗质量。大数据分析技术将使临床决策支
持系统更智能,这得益于对非结构化数据的分析能力日益加强。比如,可以使用图像分
析和识别技术,识别医疗影像数据,或者挖掘医疗文献数据建立医疗专家数据库,从而
给医生提出诊疗建议。此外,临床决策支持系统还可以使医疗流程中大部分的工作流向
护理人员和助理医生,使医生从耗时过长的简单咨询工作中解脱出来,提高工作效率。
(3)医疗数据透明度。
提高医疗过程数据的透明度,可以使医生、医院的绩效更透明,间接促进医疗服务
质量的提高。数据分析可以带来业务流程的精简,降低成本,找到符合需求工作更高效
的员工,从而提高护理质量,给病人带来更好的体验,也给医疗服务机构带来业绩增长
潜力。公开发布医疗质量和绩效数据还可以帮助病人做出更明智的健康护理决定,这也
将使医院提高总体绩效,更具竞争力。
(4)远程病人监控。
从对慢性病人的远程监控系统收集数据,并将分析结果反馈给监控设备(查看病人
是否遵从医嘱进行治疗),从而确定后续用药和治疗方案。通过对远程监控系统产生的
数据分析,可以减少病人的住院时间,减少急诊量,提高家庭护理比例和门诊医生预
约量。
(5)对病人档案的先进分析。
在病人档案方面应用大数据分析可以确定某类疾病的易感人群。帮助识别哪些病人
有患糖尿病、高血压等疾病的高风险,使他们尽早接受预防性保健方案。这些方法也可
以帮助患者从已经存在的疾病管理方案中找到最好的治疗方案。
R 语言医疗大数据分析的主要目标是针对海量医疗数据分析,提出了医疗大数据分
析的新模式,并分析比较了两种分析模式的区别,开展R 语言等统计模型的应用研究,建立从统计模型、指标提取、统计模型检验与优化、统计模型重写、数据可视化的一套
方法,在此基础上具体针对 BI 工具发现问题,应用 R 语言进行了异常医疗质量指标的
相关因素分析。
利用 R 语言对门诊和用药大数据进行分析,利用信息技术探索基层医疗卫生机构门
诊用药规律,为合理用药提供依据。具体做法是通过省基层医疗机构管理信息系统,提
取医院门诊某阶段的用药情况。通过 arules包中的eclat函数,设置参数最小求频繁项集,即在门诊用药记录中,某种药品的出现频率,按照由大到小的次数排序,得到门诊使用
较多(频繁)的药品列表;通过 arules 包中的 apriori 函数,可以发现在门诊用药数据中
的多条关联规则。
1.3 R 的安装与启动
本节介绍 R 软件的安装与启动,以及几个好用的 IDE,再比较使用 IDE 执行代码与
直接使用 R控制台执行代码的异同。
6
R 语言与大数据编程实战
1.3.1? 安装并启动 R
R 核心团队免费向用户提供 R 软件,无论用户使用的是 UNIX、Windows 还是 Mac
OS 系统,都可以在R 网站上很方便地下载最新的 R软件。
R 网站的主页网址为 https:www.r-project.org,这是可直接登入的英文网页,在这
一主页中使用蓝色字体标出了一些超链接,分别链向与 R 相关的其他网页,比如FAQ(常
见的问题及答案)网页,以及有关R 的新闻等。
在 R 主页的 Getting Started 标题下方有一个蓝色加粗的 download R,它指向一个
CRAN 的镜像网址汇总页,汇总了分布在全球各个国家的许多镜像服务器,其中我国
至少有 4 个,用户可以选择最近的镜像。在镜像页中,用户根据自己的计算机系统选择
对应的 R 软件版本,即可点击下载。R-3.4.1 是目前最新的版本,Windows 版本大约有
62.2MB 大小,此时下载的 R 仅包含最基础的函数,在后续的学习中还需要陆续添加其
他的程序包。
执行下载好的 exe 文件,Windows 系统中将弹出一个安装向导,R 软件的安装目录
默认为系统盘,但将其安装到其他盘也不影响使用。需要注意的是在第四步中,安装向
导要求用户选择组件时,最好不要选择默认的选项。
如图 1.1 所示,当安装向导执行到第 4 步时,用户组件共有 4 个组件可供选择,默
认选项是将这 4 个组件全部安装。在“用户安装”下拉框下还有“32 位用户安装”、“64
位用户安装”、“自定义安装”三个选项,用户只需根据自己的机型选择32 位或 64 位即可,不需要将4 个组件全部下载。
R 成功安装完毕后,桌面将出现一个宝蓝色的 R 图标,只需双击 R 图标,即可启动
R 软件。
Windows 系统下运行 R 的工具也称为 RGui,即 R 图形用户界面。图 1.2 所示是一
个 64 位的 RGui。在 RGui 的菜单栏中有一些中文选项及一些快捷操作,其中最常用的
菜单选项是文件菜单和程序包菜单。
图 1.1 选择R 软件的组件
在 RGui中间还有一个更小的 R Console,也称为 R控制台,控制台是用户执行代码
的地方。蓝色的文字对R 进行了一些基本声明,并给出了一些用以查看帮助文件的命令。7
第1章 R 的基本介绍
在声明文字下方有一个醒目的红色“>”形提示符,其后跟随了一个闪烁的红色光标。“>”
提示用户在此输入命令,只需回车,命令就会被 R 执行,同时 R会在新的一行上再次生
成“>”提示符。显然,退出RGui 时,只需点击右上角红色小叉即可。
图1.2 R控制台
在 Mac OS 环境下运行 R 的工具是 R.app,在 UNIX 环境下启动 R 时需要在路径中
包含 R文件,然后输入命令R 即可。
1.3.2? 安装并启动一个 IDE
R 软件虽然提供了文本编辑器,但为了更方便地使用 R,大多数用户都会选择额外
安装一个 IDE(集成开发环境)用于辅助编程。IDE 提供一个图形开发环境,语法编辑
功能也通常更为强大。
在此向统计人员强烈推荐 RStudio 软件。RStudio 是一个专门为 R 定制的免费 IDE,它将 R 中的特色功能体现得淋漓尽致。网址 https:www.rstudio.comproductsrstudio
download 提供了适用于不同计算机平台的 RStudio 版本,包括 Windows、Mac OS、Ubuntu、Fedora 等,用户只需在“Installers for Supported Platforms”标题下方选择合适
的版本即可。
RStudio软件的安装十分简单,仅需设定安装目录和文件夹名称即可。为了方便起见,通常把 R 和 RStudio 放在同一个目录下。安装完毕后,桌面上同样会生成一个宝蓝色的、与 R 稍有区别的RStudio 图标,双击图标即可启动 RStudio软件。
如图 1.3 所示,RStudio 软件被切分为 4 个小窗口。其中,左上角的窗口用于展示 R
脚本,用户可以在这里打开已经写好的 R 脚本,或者在这里编写一个脚本而不立刻执行
它。左下角的窗口则是 R 软件的控制台,它其实就是 1.2.1 节中提到的 R 控制台,在用
户打开 RStudio时,RStudio会在后台启动 R 软件。
8
R 语言与大数据编程实战
图 1.3 RStudio软件启动界面
RStudio 的右上角显示了环境栏和历史栏,在执行代码时,环境栏会自动显示当前
程序中都有哪些变量,以及它们的属性分别是什么,当变量繁多时这一栏格外有用。历
史栏中则存有已经执行过的历史代码。右下角的窗口同样提供了好几个下拉菜单,其中
包括R中的各类帮助、函数介绍和程序包介绍。
总的来说, RStudio能够提供的信息远比R 软件丰富,它提供了更加美观的绘图窗口,用户在查看帮助时也显得尤为便捷。此外,RStudio 也支持远程访问,用户可以在平板
电脑或手机上打开它,并远程访问计算机上的R 执行代码。
RStudio 的唯一缺点在于,它只用于 R开发。因此,对并非只写 R代码的程序员来说,RStudio 也许不是最好的选择。不过有许多支持 Java、C、Python 等语言的 IDE 同样也
支持 R,其中较为流行的优质 IDE 有 Emacs、Eclipse、Tinn-R 等,用户完全可以根据自
己的喜好选择一个最合适的 IDE。
与 RStudio 相比,这些支持多种语言的 IDE 在 R 的特色功能方面体现得不如
RStudio 好,但它们能够提供诸如语法高亮、快捷操作等实用的功能。值得注意的是,有时用户需要下载专门的插件或下载专门的版本才能使IDE 支持R。
1.4 R的向量、矩阵和数组
向量、矩阵和数组是 R中的三种基本变量,也是数据分析中最常见的数据存储单位。
本节讨论这三种变量的特点,并展示它们的操作方法。
1.4.1? 向量的操作方法和固有属性
向量是一个一维变量,即一列数据的集合。它是我们在数据分析时使用的最小的单
位,矩阵和数组都是向量的扩展结果。我们通常使用 c 函数来创建向量,其他可以用
于创建向量的函数还有 seq 函数和 rep函数,其中前者用于排序,后者用于重复。9
第1章 R 的基本介绍
> x <- c(1:5)
> c(6:10) -> y
> x;y
[1] 1 2 3 4 5
[1] 6 7 8 9 10
> x[0];y[1]
Integer(0)
[1] 6
上述代码创建了两个向量并分别将它们赋给了x 和 y。第一行代码中c 函数内的冒
号表示创建一个序列,“<-”符号则将这个序列赋给了 x。第二行代码使用“->”符号
将另外一个序列赋给了 y。这两条赋值命令都是合法的,不过“<-”符号是较常见的选择。
R 并不会主动返回 x 和 y 的结果,为了查看 x 和 y 中存放的内容,我们执行了第三
条代码。第三条代码使用分号隔开了 x 和 y,因此 R 会同时返回这二者。显然,x 中存
放了序列 1,2,3,4,5,y 中存放了序列 6,7,8,9,10。此外,也可以使用下标查看向量中的某
个具体元素,R 中向量的下标从 1 开始标起,这一点与C 语言等其他语言是不同的。第
4 条代码查看了向量 x 中下标为 0 的元素和向量 y 中下标为 1 的元素,可以发现,x[0]
返回了一个奇怪的结果,y[1]则返回了 y中第一个元素。
> z <- c(x,y,11,12)
> z
[1] 1 2 3 4 5 6 7 8 9 10 11 12
> z <- x+y
> z
[1] 7 9 11 13 15
> names(z) <- c(a,b,c)
> z
a b c
7 9 11 13 15
c 函数同样可以用于拼接向量,它既可以将已有的向量拼接起来,也可以将已有的
向量和新的数字拼接起来。上述代码中第一条代码将向量x、y 和数字 11、12 拼接成一
个更长的向量 z,第二条代码展示了向量z 中存储的内容。
第三、四条代码将向量 x 和 y 相加后的值赋给了向量 z,并查看了 z。由于 x 和 y 的
长度相同,因此 z 中存储的内容即为 x 和 y 中元素一一对应相加后的结果。R 中可以直
接在向量上执行加、减、乘、除等基本运算,但需要保证执行运算的两条向量长度相等,否则将得到难以解释的或错误的结果。在执行了第 3、4 条代码后,向量 z 中的内容已
经被替换为了序列 7,9,11,13,15。
我们不仅可以为向量命名,向量中的每一个元素也可以单独得到名字。第4 行使用
names 函数为向量 z 中的元素命名,双引号引起的 a、b、c 表示这三个字母在这里是字
符形式,当然,它们也不可能是别的形式。由于我们只命名了三个向量,因此向量 z 中
只有前三个元素有名字,后两个元素的名字为
为向量命名遵循一样的规则,即名字中只能含有字母、数字、点和下画线,但不能以数
10
R 语言与大数据编程实战
字或一个点后跟数字开头,也不能和R 中的保留字相同,比如 if和for。
> min(z)
[1] 7
> range(z)
[1] 7 15
> sum(z)
[1] 55
> var(z)
[1] 10
作为一个统计软件,R 中内置的运算函数非常丰富,写起来也非常方便。上述代码
给出了 min 函数、range 函数、sum 函数和 var 函数 4 个函数,它们的功能分别是
对 z 取最小值、给出 z 的范围、计算z 的和、计算z 的方差。
其他经常用到的向量运算函数还有用于取出数据集中最大值的max 函数,求最值
元素的下标数的which.min函数和which.max函数,求向量中元素连乘积的prod函数,求均值、标准差、顺序统计量的函数,求积分的函数等。这些函数不但可以用于向量运算,也可以仅对向量中的某些元素进行运算。
> length(z)
[1] 5
> mode(z)
[1] numeric
> z <- as.character(z)
> mode(z)
[1] character
> min(z)
[1] 11
与向量相关的另一个重要知识是向量的属性。我们同时关心向量的长度和类型。
length 函数用于查看向量的长度,由上述代码可知,向量 z 的长度是 5。mode 函数
用于查看向量的类型,显然,向量 z 的类型是 numeric 型,即数值型。第三行代码使
用 as.character 函数将向量 z 的类型转换为字符型,其他类似函数还有 as.factor 函数、as.integer函数等。此时再次查看向量 z 的类型,其返回结果显示 z已变为了字符型。
向量的类型与其适用的运算函数有关,当向量z变为字符型后,再次查看它的最小值,此时出现的结果为 11,显然不是我们想要的结果。通常无须声明新向量的类型,R 就会
自动为新向量分配一个合适的类型。而向量的类型转换也不是没有限制,比如数值型的
向量可以转为字符型,但存储了字母元素的字符型向量就无法转化为数值型向量。
1.4.2? 矩阵的操作和运算
在向量、矩阵、数组中,矩阵是最具价值的一类变量。矩阵可以看作向量的拓展,向量是只具有长度的一维变量,而矩阵则是同时具有“长度”和“宽度”的二维变量,在实际的数据分析工作中,许多数据都以矩阵的形式进行处理。11
第1章 R 的基本介绍
> x <- c(1:12)
> matx1 <- matrix(x,nrow=3)
> matx1
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
不妨从矩阵的创建开始学习矩阵的特性。上述代码中第1行代码创建了一个1~12的
数字序列 x,第 2 行代码则利用 matrix 函数创建矩阵 matx1。在第 2 行代码中向
matrix函数传入了两个参数,第1 个参数设定使用x 的值创建矩阵,第2 个参数则指定
矩阵的行数为 3。matrix 函数中还可以设定其他的函数,如利用 ncol 参数来设定矩阵
的列数,nrow 函数和 ncol 函数能够查看矩阵的行数和列数。在 R 控制台中输入
“?matrix”可以查看 matrix函数的帮助文档。
查看 matx1,容易发现这是一个 3 行 4 列的矩阵,序列 x 逐列填充了这个矩阵。由
于 12 正好是 3 的倍数,因此序列 x 恰好填满了一个整齐的矩阵,倘若元素个数和矩阵
行数不成倍数关系,R就会自动用前几个元素填满矩阵的最后一列,并给出一个警告。
R 在返回矩阵时,同时还返回了行和列的下标。由于矩阵是一个二维变量,所以矩
阵中的元素需要两个下标来标识位置。与向量元素相似,矩阵元素的下标同样用 [] 符号
括起来,并用逗号分开两个不同下标。如 [2,3]就表示处于矩阵第二行、第三列位置的元
素。在 R 控制台中输入命令 matx1[2,3] 即可查看矩阵 matx1 中下标为 [2,3] 的元素,输
入命令 matx1[2,] 即可查看矩阵 matx1 中第二行中所有的元素,这种规则同样适用于进
行矩阵运算。
> rownames(matx1) <- c(x1,x2,x3)
> colnames(matx1) <- c(y1,y2,y3,y4)
> matx1
y1 y2 y3 y4
x1 1 4 7 10
x2 2 5 8 11
x3 3 6 9 12
> as.vector(matx1)
[1] 1 2 3 4 5 6 7 8 9 10 11 12
显然,矩阵这种二维数据结构是最常用的结构,它就像一张大表,能够放入一行行
个案和一列列变量。因此,为矩阵命名是非常必要的一件事,尤其是为列命名。在矩阵
中为行命名的函数是 rownames 函数,为列命名的函数是colnames 函数。这两个函数
的用法都和names 函数类似,将一个字符向量中的元素逐个设为矩阵的行或列的名字。
查看 matx1 中存储的内容,此时矩阵的名称都设定完毕,矩阵中的信息将更加丰富。
二维的矩阵同样可以压缩为一维的向量,上述代码中最后一行代码使用as.vector
函数完成了这项任务。由于我们在后续程序中并不打算再次使用这个向量,因此这行代
码并没有使用“<-”符号将它赋给某个变量,于是 R 直接返回了这个向量中的内容。此
时矩阵 matx1 再次成为一个1 ~ 12的序列。
12
R 语言与大数据编程实战
> class(matx1)
[1] matrix
> cbind(matx1,matx1)
y1 y2 y3 y4 y1 y2 y3 y4
x1 1 4 7 10 1 4 7 10
x2 2 5 8 11 2 5 8 11
x3 3 6 9 12 3 6 9 12
> rbind(matx1,matx1)
y1 y2 y3 y4
x1 1 4 7 10
x2 2 5 8 11
x3 3 6 9 12
x1 1 4 7 10
x2 2 5 8 11
x3 3 6 9 12
除 mode 函数能够查看的元素类型外,变量的类型同样很重要。上述代码中第一行
代码使用 class 函数查看了 matx1 的变量类型,R 的返回结果为矩阵。class 函数能够
查看多种变量的类型,与元素类型相似,只有在变量类型已知时我们才能正确地选择操
作函数。
合并矩阵时需要专门的函数。cbind 函数用于按列合并矩阵,rbind 函数用于按
行合并矩阵。上述代码分别使用这两个函数将两个matx1 矩阵合并为一个新矩阵,在按
列合并时,新矩阵的列数将增多,按行合并时,新矩阵的行数将增多。cbind 函数和
rbind 函数同样可以拼接两个不同的矩阵,不过在使用 cbind 函数时,被拼接的矩阵
的行数务必一致;在使用 rbind 函数时,被拼接的矩阵的列数务必一致,否则R 将报错。
> matx2 <- matrix(c(13:24),nrow=4)
> colnames(matx2) <- c(y5,y6,y7)
> rownames(matx2) <- c(x4,x5,x6,x7)
> matx1%%matx2
y5 y6 y7
x1 430 452 474
x2 500 526 552
x3 570 600 630
在行列数一致时,两个矩阵同样能够完成四则运算,还有一些特别的矩阵运算也
很实用。上述代码首先创建了一个 4 行 3 列的新矩阵 matx2,在创建 matx2 时我们用一
种更简洁的方式写出了 matrix 函数。第 4 行代码使用“%%”运算符计算了 matx1 和
matx2的内积,内积结果中分别保留了matx1中的行名称和 matx2中的列名称。
> matx3 <- matrix(c(3,0,3,2,5,7,1,-3,5),nrow=3)
> t(matx3)
[,1] [,2] [,3]
[1,] 3 0 3
[2,] 2 5 7
[3,] 1 -3 513
第1章 R 的基本介绍
> solve(matx3)
[,1] [,2] [,3]
[1,] 0.43809524 -0.02857143 -0.10476190
[2,] -0.08571429 0.11428571 0.08571429
[3,] -0.14285714 -0.14285714 0.14285714
上述代码创建了一个行数和列数相同的方阵。方阵是最特殊的一种矩阵,它能够进
行的运算也最丰富。t 函数的结果是矩阵的转置,solve 函数的结果则是矩阵的逆。能
够用于方阵的函数还有用于进行奇异值分解的 svd 函数等。
1.4.3? 数组中的维度函数
与其他语言中定义的数组相类似,R 中的数组是一种高维的数据结构。矩阵可以看
作数组的一种特殊形式,由于维数过高时无论作图还是运算都非常不方便,因此数组是
最不常用的一种变量。
> ary1 <- array(1:12,dim=c(2,3,2))
> ary1
, , 1
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
, , 2
[,1] [,2] [,3]
[1,] 7 9 11
[2,] 8 10 12
> class(ary1)
[1] array
上述代码使用 array 函数创建了数组 ary1。array 函数中第一个参数表示使用从
1 到 12 的序列创建矩阵,第二个参数 dim 则指明数组共有 3 个维度,维度值分别是 2、3、2。
查看 ary1 中存放的数据,它由两个二行三列的矩阵构成,每一个矩阵又有一个属于
自己的序号。观察 [ ] 框中序号和逗号之间的顺序,可以发现,ary1 中第一维由两个矩
阵的行构成,第二维由两个矩阵的列构成,第三维则由矩阵前方的序号构成(这两个序
号前面都有两个逗号,表示它们是第三维)。
> dimnames(ary1) <- list(
+ c(a,b),+ c(c,d,e),+ c(f,g))
> ary1
, , f
14
R 语言与大数据编程实战
c d e
a 1 3 5
b 2 4 6
, , g
c d e
a 7 9 11
b 8 10 12
由于数组的维数是不固定的,因此为数组命名时统一由 dimnames 函数完成。上述
代码中首次出现了代码连接符。为了整洁美观,我们把较长的第一句代码拆成4行短代码。
第一行代码结束时R 检测到这句代码还未结束,便自动生成一个加号用以连接下一行代
码。这种形式在复杂程序中经常出现。
列表函数 list 将三个 c 函数生成的向量组合起来,并用来创建 ary1 中的名称,其
中第 1 个向量中的元素用于为ary1 的第一维变量命名,第 2 个向量中的元素用于为第二
维向量命名,第3个向量则和第三维形成对应关系。
> ary2 <- array(1:6,dim=c(2,3))
> ary2
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
> class(ary1);class(ary2)
[1] array
[1] matrix
在创建数组并命名的过程中我们已经发现,维数多于二维的数组表现起来较为烦琐,每个维度的意义难以理解,运算起来更是非常不方便,远不如多创建几个矩阵方便。作
为数组的一种特殊形式,矩阵同样可以通过 array 函数创建。上述代码中 array 函数
的 dim 参数仅设置了两个维度,此时数组 ary2 看起来与矩阵似乎毫无区别,为了确定二
维数组和矩阵是否一致,第三行代码中利用 class 函数分别查看了 ary1 和 ary2 的变量
类型,ary1仍是数组类型,而 ary2 则变为矩阵类型。
1.5 R的列表和数据框
除向量、矩阵和数组外,列表和数据框也是 R 中两类基本的数据结构,这二者比向量、矩阵和数组更加灵活,是应用范围更广的两类变量。本节简单介绍列表和数据框的特性,并将它们与向量、矩阵和数组进行对比。
1.5.1? 列表的特性和编辑方法
列表是向量的一种特殊形式,它同时又与数组的形式有些相似。在 1.3 节中我们为15
第1章 R 的基本介绍
数组 ary1 命名时创建了第一个列表,其中包含三个长度分别为 2、3、2 的元素。
> lst <- list(c(1,2),c(3,4,5),c(6,7))
> lst
[[1]]
[1] 1 2
[[2]]
[1] 3 4 5
[[3]]
[1] 6 7
> names(lst) <- c(one,two,three)
> lst
one
[1] 1 2
two
[1] 3 4 5
three
[1] 6 7
上述代码中第一行代码再次创建了一个包含三个长度分别为 2、3、2 的元素的列表
lst,list 函数中使用逗号将三个元素分开,每个元素又由 c 函数构建。不妨将列表 lst
看作一个包含三个元素的向量,只不过列表中每个元素又由更小的元素单位组成。查看
lst 中存放的数据,其存放数据的方式与数组有些类似,不过列表只具有两个维度,每个
维度的下标标识也与数组不相同。
列表的命名函数与向量一致。使用 names 函数可以很方便地为列表的每个元素命
名,再次查看 lst,其中的元素已经被命名完毕,注意元素名称由一个 符号标出。
> lstone <- c(a,b)
> lst
one
[1] a b
two
[1] 3 4 5
three
[1] 6 7
> lstfour <- list(c(8,8),c(9,9))
> lst
one
[1] a b
16
R 语言与大数据编程实战
two
[1] 3 4 5
three
[1] 6 7
four
four[[1]]
[1] 8 8
four[[2]]
[1] 9 9
> unlist(lst)
one1 one2 two1 two2 two3 three1 three2 four1 four2 four3 four4
a b 3 4 5 6 7 8 8 9 9
与仅能存放一种数据类型的向量不同,列表中能够存放多种类型的数据。上述代码
中第 1、2 行代码将列表 lst 中的第 1 个元素替换为了字符型数据 a、b;第 4、5 行元素
在列表lst 中增加了一个新的元素four,新元素是一个包含两个元素的小列表,在列表中
嵌入列表是合法的做法。此时 lst 中的数据结构变得更加复杂,显然列表中嵌入列表这
种做法的可读性并不强,因此通常不这样做。
在前 4 行代码中使用“列表名 ++ 元素名”这种形式来指定操作对象,这是列表操
作中较为特殊的一点,除非事先用 attach函数绑定列表,否则不能直接使用元素名。
列表同样可以转换为向量形式。上述代码中第 5 行代码使用 unlist 函数将 lst 转换
成向量,向量的元素名由列表的元素名生成。由于 lst 中既有字符元素,也有数值元素,而数值型可变为字符型,反过来则不合法,因此转换后的向量是字符型的(这一点由向
量元素被双引号引起可知)。使用as.list 函数也可以将向量转换为列表。
> lst2 <- c(list(zero=c(1,2)),lst)
> lst2
zero
[1] 1 2
one
[1] a b
two
[1] 3 4 5
three
[1] 6 7
four
four[[1]]17
第1章 R 的基本介绍
[1] 8 8
four[[2]]
[1] 9 9
c 函数既可以拼接向量,也可以拼接列表 ;既可以将列表和向量拼接起来,也可以
将列表和列表拼接起来。上述代码拼接了两个小列表,其中第一个列表直接在 c 函数
内用 list 函数生成,第二个列表则是 lst 列表。我们在生成第一个列表时直接在 list 函
数内命名,这种简洁的做法也是合法的。
> lstthree+lst2zero
[1] 7 9
> lst[[3]]+lst2[[1]]
[1] 7 9
> lst[3]+lst2[1]
错误于lst[3] + lst2[1] : 二进列运算符中有非数值参数
在对列表进行运算时有两种方法。上述代码中第一行代码利用元素名进行运算,第
2 行代码利用元素下标进行运算,这两条代码相互等价。由于列表中元素的长度和类型
不要求一致,因此对列表中元素进行运算时需要确认被运算的两个元素的长度和类型符
合运算条件,否则会报错。
使用列表的下标时也需要格外小心。在第2行代码中使用两个方括号括起了下标数,这样取出的内容就是元素中的内容,当只用一个方括号括起下标时,取出的内容就是该
元素。这是两个不同的概念,具体来说,第 2 行代码取出内容的类型是数值,而第 3 行
代码取出内容的类型则是列表,因此第3 行代码会报错,不过这并不是说“lst[3]”这种
操作是不合法的,它只是不能够用于四则运算。
1.5.2? 数据框的创建和基本操作
在所有的数据结构中,数据框是最常用的一类结构。它与矩阵相似,具有规整的二
维结构,同时数据框允许在不同列中存储不同的数据类型,这使得数据框要比矩阵更
实用。
> df <- data.frame(x=c(a,b,c,d),y=c(1,2,3,4),z=c(5,6,7,8))
> df
x y z
1 a 1 5
2 b 2 6
3 c 3 7
4 d 4 8
> dfz0 <- dfz>6
> df
x y z z0
1 a 1 5 FALSE
2 b 2 6 FALSE
18
R 语言与大数据编程实战
3 c 3 7 TRUE
4 d 4 8 TRUE
上述代码显示了数据框的创建和增添。其中,第 1 行代码使用 data.frame 函数创
建了一个 4 行 3 列的数据框 df,在 data.frame 函数中同时也规定了每一列的名称。在
创建数据框时如果不指定名称,R 会自动为每一列分配名称,通常是 X1、X2、X3……
这种形式。
与列表相似,在没有使用 attach 函数绑定数据框之前,调用数据框中的变量时需
要使用“数据框名 ++ 变量名”的格式。上述代码中第三行代码在数据框 df 中添加了
一个新列 z0,z0 中的元素是判断 df 中 z 变量是否大于 6 的逻辑值,若不等式成立,z0
的结果就是“TRUE”,反之则是“FALSE”。
> df[2:3,-4]
x y z
2 b 2 6
3 c 3 7
> df[dfy>3,c(x,z)]
x z
4 d 8
数据框中元素下标的表示方法与矩阵类似,在数据框中,使用元素下标进行操作非
常方便。上述代码利用下标筛选查看了df 中的数据,其中,第1 行代码查看了第2~3 行
的数据,参数“-4”表明返回结果中去掉第 4 列(但 df 中的数据并未改变);第 2 行代
码筛选出数据框 df 中 y 变量的值大于 3 的数据,并查看了 x 列和 z 列,注意方括号中第
一个参数需要写成“数据框名++ 变量名”格式,否则R 将报错。
> nrow(df)
[1] 4
> names(df)[4] <- z1
> df
x y z z1
1 a 1 5 FALSE
2 b 2 6 FALSE
3 c 3 7 TRUE
4 d 4 8 TRUE
数据框的拼接与矩阵类似,cbind函数和rbind函数能够将两个数据框按列或按行
合并,不过被合并的数据框需要满足列数相等或行数相等。此外,由于实际应用中数据
框往往比较大,因此统计数据框的行数和列数是非常必要的,上述代码中第1行代码使
用nrow函数统计了数据框的行数,与之相对的是ncol函数,它可以统计数据框的列数。
上述代码中第 2 行代码修改了 df 中第 4 列的列名。数据框的列名称总是被存储在一
条向量中,因此 df[4] 这种写法就相当于 df[4,],表示 df 中的第 4 列,相对的,df[,4] 则
表示数据框df 中的第 4 行。
> lst <- as.list(df)19
第1章 R 的基本介绍
> lst
x
[1] a b c d
Levels: a b c d
y
[1] 1 2 3 4
z
[1] 5 6 7 8
z1
[1] FALSE FALSE TRUE TRUE
> df2 <- as.data.frame(lst)
> df2
x y z z1
1 a 1 5 FALSE
2 b 2 6 FALSE
3 c 3 7 TRUE
4 d 4 8 TRUE
数据框和列表之间也存在相互转换的函数。其中,as.list 函数能将数据框转换为列
表,as.data.frame 函数能将列表转换为数据框。查看第 1、2 行代码得到的返回结果,df 中的 4 列被存储为 4 个元素,这 4 个元素顺序构成了列表,需要注意的是,其中元素
x 有一个 Levels 标注,这表明元素 x 是因子型的,这是由于数据框会自动将字符型变量
存储为因子型,stringAsFactors函数能够避免这种强制转换。
上述代码中第 3、4 行代码显示了列表如何转换为矩阵,并不是所有的列表都可以
转换为矩阵,只有元素长度都相等的列表才可以。除列表外,矩阵和一些其他形式的数
据也可以转换为数据框。
1.6 R 数据文件的载入和载出
R 支持多种数据文件的载入和载出。本节讨论纯文本文件、非结构化文本文件、其
他统计软件格式文件和网页文件等多种不同的文件类型,并介绍一些基本的文件读取函
数的用法。
1.6.1? 结构化纯文本文件的读取和输出
结构化纯文本文件是最常用到的一类文件,也是最好处理的一类文件。这类文件中
每行都存储一条数据,每条数据中的元素又由分隔符分开,当分隔符是逗号时,纯文本
文件就是 csv格式的 ;当分隔符是空格时,纯文本文件就是 txt格式的。
图 1.4 显示了文件 txtdata 中的前几条数据。显然,这个文件中有三列数据,列名称
20
R 语言与大数据编程实战
分别为 x、y、z,由于这个文件中的数据是由制表符分割的,因此该图中两个数据之间
的缝隙显然比较大,对于 R 来说,制表符和空格造成的效果是一样的,因此这并不影响
代码的执行。
图 1.4 txtdata文件数据格式
> getwd
[1] C:UsersDocuments
> txt <- read.table(txtdata.txt,header=TRUE)
> head(txt)
x y z
1 3.542485 1.977398 -1
2 3.018896 2.556416 -1
3 7.551510 -1.580030 1
4 2.114999 -0.004466 -1
5 8.127113 1.274372 1
6 7.108772 -0.986906 1
在正式读取数据之前,还需要先将数据文件放到 R 的工作目录下。如果你不知道你
计算机上 R 的工作目录是哪条路径,可以使用命令“getwd”来查询,比如笔者的查询
结果为C:UsersDocuments,这条路径就是笔者的R 的工作目录。
将 txtdata 文件放到工作目录下,即可用 read.table 函数来读取文本文件中的内容。
read.table 函数中第一个参数指定读取的文件是 txtdata.txt 文件,注意,这个参数中的
文件扩展名绝对不能省略,如果没有写明文件扩展名,R 就会报错;第二个参数指定
header 为真,也就是读取的文件中存在表头,由于 txtdata文件中写明了数据的列名称是 x、y、z,因此需要设定这个参数。
第 3 行代码使用 head 函数查看了 txt 中的前 6 行数据,如果直接查看 txt,显然,R 就会刷出好几屏的数据。从 head 函数的返回结果可知,此时 txtdata 中的数据已经成
功载入到 R 中,这三列数据规规整整地排列在一起,列名称也没有搞错。
如图1.5 所示,文本文件csvdata中存放的数据和文件txtdata中的数据是一致的,只
不过 csvdata 中的数据是由逗号进行的分割,而且这份数据没有表头。同样可以用 read.
table函数读取数据。21
第1章 R 的基本介绍
图 1.5 csvdata 文件数据格式
> csv <- read.table(datacsvdata.csv,sep=,)
> head(csv)
V1 V2 V3
1 3.542485 1.977398 -1
2 3.018896 2.556416 -1
3 7.551510 -1.580030 1
4 2.114999 -0.004466 -1
5 8.127113 1.274372 1
6 7.108772 -0.986906 1
R 可以读取并未放在工作目录下的文件,比如 csvdata 文件的存放目录为 C:Users
Documentsdata,在读取文件时,read.table 中的第一个参数写明读取的是 data 文件夹
下的 csvdata 文件(data 前的工作目录已被省略)。类似地,如果想要R 读取存放在其他
盘的文件,只需在 read.table中的第一个参数处写明文件目录即可。
read.table 中的第二个参数设定为 sep 值为逗号,即文件的分隔符为逗号。通过设
定 sep 值,read.table 函数可以读取由不同分隔符分割的多种文件。除 header 和 sep 外,read.table 函数还提供了用于指定读取行数的 nrow 参数、跳过开头几行的 skip 参数、确定行名称和列名称的参数、指定文件的字符编码参数等,在 R 控制台中输入“?read.
table”可以查看它的更多信息。
与 read.table 非常相似的函数还有分隔符默认为逗号的 read.csv 函数;小数位默
认为句号、分隔符默认为制表符的 read.delim 函数等。此外还有一个更为灵活的 scan
函数用于读取不标准的文本文件,它能够写出更复杂的读取命令。无论是哪个函数,它
们都会自动将读取的数据设置为数据框格式。
> write.csv(csv,?le=csv2.csv)
> write.table(txt,?le=txt2.txt)
与读取文件相对应的是文件的输入,显然,write.csv函数用于输出 csv格式的文本
文件,write.table 函数用于输出 txt 格式的文本文件,另外,还有一个 write 函数也能
实现同样的功能。上述两条代码利用数据框 csv生成了 csv2.csv 文件,利用数据框 txt生
成了 txt2.txt 文件,这两个文件都存放在 R 的工作目录下,若要存放到其他目录下,只
需在 ?le参数中注明即可。
22
R 语言与大数据编程实战
1.6.2? 其他文件的读取和输出
文本文件中除存储用分隔符分开的数据表外,也可能存储着真正的字符数据。R 提
供了 readLines 函数来逐行读取文本信息,作为例子,emaildata.txt 是一个放在 R 工作
目录下的邮件。
> email <- readLines(emaildata.txt)
> head(email)
[1] WHat is going on there?
[2] I talked to John on email. We talked about some computer stuff that's it.
[3]
[4] I went bike riding in the rain, it was not that cold.
[5]
[6] We went to the museum in SF yesterday it was 3 to get in and they had
上述代码使用 readLines 函数读取了 emaildata.txt 中的信息,由于字符文件的结构
松散,因此表头、分隔符等参数都是不需要设定的。 head函数查看了email的前6个元素,它们正好和emaildata中的前6行相对应。显然,这种数据结构并不是数据预处理的终点,通常还需进一步处理后,非结构的文本文件才能用于数据分析。
> class(email)
[1] character
> writeLines(email,email2.txt)
与 readLines 函数相对应的是 writeLines 函数,这个函数将字符向量逐行地输出
为一个文本文件。实际上,readLines 函数读入的数据也是向量类型的。需要注意的是
在 writeLines 函数中指定输出文件的参数写作 email2.txt,而 ?le=email2.txt 这种写
法是不合法的。
除结构化文本文件和非结构化文本文件外,来自其他统计软件的数据、来自网页的
数据和来自数据库的数据也是常见的数据源,R 同样为这些数据提供了用于读取和输出
的函数。
其他统计软件的数据主要包括来自 Excel、SAS、SPSS、Stata、MATLAB 等统计
软件的数据。xlsx 包提供的 read.xlsx 函数能够读取 Excel 软件所生成的 xlsx 文件;
foreign 包同时提供了能够读取 SAS 文件的 read.ssd 函数、能够读取 DTA 文件(由
Stata 软件生成)的 read.dta 函数和能够读取 SPSS 文件的 read.spss 函数;R.matlab 包
则提供了能够读取 MATLAB 文件的 readMat 函数。除这些方法外,还可以先将其他软
件格式的数据转换为文本文件格式,再读取到 R中。
来自网页的数据成分较为复杂,有一些网站提供了对应的 csv 数据文件以供下载和
读取;另一些网站则提供了专门的包,包中具有读取数据的函数;其他那些既不提供下
载文件也不提供包和函数的网站就显得较为复杂,简单来说,我们需要人工分析其网站
源代码,找到有效数据,并找到数据在前后文中的标签,通过设置标签来使R 下载数据,下载完毕后还需进一步加工才可以将数据正式投入数据分析中。即便R提供了众多函数,这也仍是一件很复杂的事情。23
第1章 R 的基本介绍
来自数据库的数据是最后一类常见的数据。数据库能够管理海量数据,并允许多人
访问,这在企业应用中最为常见。要从数据库中获取数据,就首先要加载使 R 能够连接
到数据库的包,以 MySQL 为例,对应的包就是 RMySQL 包,设置好驱动器类型和文件
路径后,即可从 MySQL中读取文件。
1.7 向 R 中安装包
在 1.5 节关于数据读取的讨论中,多次提到了包的概念。在 R 中,包是一个重要的
概念,R 社区内所有用户的共同努力使得如今已有成千上万的R 包可供使用,这些R 包
拓展了 R 的用途,对数据分析师来说,如何选择合适的 R包用以数据分析是一个重要的
命题。
在下载R时,我们已经附带着下载了一些基本包,但这些包远远不够,比如,ggplot2
程序包就是一个非常重要、应用非常广泛的绘图包。向 R 中安装包时,利用 GUI 是最
方便的选择。在正式开始安装包之前,用户务必要保证自己的电脑处于联网状态,并不
受下载限制。
在 RGui 中的顶部菜单栏中有一个程序包下拉菜单,这一个菜单中的选项全都是关
于R程序包的安装与维护的。在正式安装程序包之前,我们需要首先设定镜像。通常来说,无论是选择“设定 CRAN 镜像”,如图 1-6 所示,还是选择“安装程序包”,RGui 都会
首先让用户设定镜像。
图 1.6 选择一个 CRAN镜像
在RGui提供的镜像中,来自中国的镜像共有4个,(见图1.7),分别是China(Beijing1)、China(Beijing2)、China(Hefei) 和 China(Xiamen)。无论是本国的镜像还是外国的镜像,它们提供的东西都是完全一致的,因此建议你选择一个最近的镜像,这样能保证下载速
度是最快的。
24
R 语言与大数据编程实战
图1.7 镜像设定对话框
在设定好镜像后,用户即可选择程序包进行安装。选择“安装程序包”,RGui 将提
供一个相当长的列表,其中按照字母顺序列出了绝大部分已有的 R包。从中找到 ggplot2
包,如图 1.8 所示,选中后单击“确定”按钮,RGui 将自动从 R 主页上下载 ggplot2 相
关的文件,并完成安装。有些包的安装需要依赖另一些包,此时 R 控制台将给出提示信
息,只需先安装好依赖包,再安装需要的包即可。
图1.8 选择一个程序包进行安装25
第1章 R 的基本介绍
除利用 GUI安装 R 包外,也可以直接使用编程的方式安装包。
> install.packages(ggplot2, repos=http:mirror.bjtu.edu.cncran)
上述代码同样安装了 ggplot2 包,install.packages 函数达到的效果和直接选择“安
装程序包”一样。同时 install.packages 函数设定的镜像网址是 http:mirror.bjtu.edu.cn
cran,这是一个中国的网址,在 https:cran.r-project.orgmirrors.html 页面可以查看其他
的中国镜像网址。
在 install.packages 函数不起作用的时候,用户也可以直接进入 R 主页下载相关的
zip 文件,并进行本地安装程序包的操作。
安装好程序包后,在使用程序包中的函数时还需向 R 中加载包,此后才能调用包中
的函数。
> library(ggplot2)
> help(package=ggplot2)
library 函数用于向 R 中加载包,注意包的名称不需要引号。使用 help 函数可以
查看 ggplot2 中包含的全部函数及它们的说明文档。加载好包后,调用包中函数时直接
写出函数名即可,只有在同时加载的多个包中出现了一样的函数时,才需要用“程序包
名 + ::+函数名”的形式对多个名称一样的函数进行区分。
> update.packages
> remove.packages(ggplot2)
上述两条代码是与包相关的最后两个重要代码,其中第 1 行代码对已有的包进行了
更新,第 2 行代码则删除了包 ggplot2,当然,第 2 行代码也能够用于删除其他的包。
第 2 章 原始数据的探索与预处理
第 1 章详细地介绍了 R 的基础知识,第 2 章围绕数据的探索与预处理进一步展开。
数据的探索和预处理是数据分析中的第一项任务,本章将讨论最常见的数据探索方法和
预处理方法,数据框是本章讨论的主要形式,在第二部分的数据挖掘实例中对本章内容
还将更深入地进行讲解。
2.1 度量数据集的集中程度
均值、分位数和众数是一列数据的基本特征,也是最常见的统计量,在对原始数据
进行探索时,这三个量能够简单地刻画出数据的轮廓,度量出数据集的集中程度。R 包
datasets 中存储了许多示例数据集,其中 ChickWeight 数据集是一份关于销售数据的领先
指标数据。
> library(datasets)
> head(BJsales)
[1] 200.1 199.5 199.4 198.9 199.0 200.2
> class(BJsales)
[1] ts
> mode(BJsales)
[1] numeric
> length(BJsales)
[1] 150
向 R 中载入程序包 datasets 后,数据集 BJsales 即可直接调用。上述代码分别查看
了 BJsales 的一些基本性质,其中,第 2 行代码查看了 BJsales 的前 6 个元素,显然,BJsales 并不是一个数据框。第 3 行代码查看了 BJsales 的属性,返回结果为 ts,这表
明 BJsales 中存放的是一列时间序列向量,即 BJsales 中的数据是按照时间顺序排列的。
在控制台中输入“?ts”可以查看更多关于数据类型ts 的信息。
mode函数的返回结果表明BJsales中的数据是数值型的,因此,计算BJsales的均值、中位数和分位数是有意义的。 length函数给出了BJsales中元素的个数,由返回结果可知,BJsales 中共有 150 个元素。
> mean(BJsales)
[1] 229.978
> mean(BJsales,trim=0.1)
[1] 229.715
> median(BJsales)
[1] 220.6527
第2章 原始数据的探索与预处理
均值和中位数是有些相似的两个统计量。均值是用所有元素的和除以所有元素的个
数得出的结果,其计算公式为 n
x
n
1 i
i ∑ = 。中位数则是将元素按顺序排列后处于正中间的数,当对偶数个元素计算中位数时,中位数是最中间两个数的均值。显然,均值和中位数都
居于总体数据的中央位置,但均值易受异常值影响,而中位数则不。
上述代码中前两行代码都使用了 mean 函数,第 1 行代码计算了 BJsales 中全体元
素的均值,第 2 行代码中的 trim 参数指定在计算均值时数值最大的 10% 的元素和数值
最小的 10% 的元素都要去掉,trim 函数能够削弱异常值的影响。这两种计算方法的结果
十分接近,说明 BJsales 中并无偏离大部分数据较远的异常值。
median函数给出了 BJsales的中位数,中位数要比均值小一些,也就是说,BJsales
中较小的数据分布较集中,较大的数据分布较分散,数据总体呈右偏分布。
> quantile(BJsales)
0% 25% 50% 75% 100%
198.600 212.575 220.650 254.675 263.300
> quantile(BJsales,c(0.85,0.9,0.95))
85% 90% 95%
257.60 259.06 261.21
quantile 函数能够给出数据的分位数,它有好几种用法,上述代码给出的是最常用
的两种用法。其中,第 1 行代码直接给出了 BJsales 的五分位数,比较分位数之间的距离,容易发现上四分位数与中位数的距离要小于它与最小值的距离,下四分位数与中位数的
距离要大于它与最大值的距离,而最小值与中位数的距离又小于最大值与中位数的距离,这也佐证了 BJsales是右偏分布的结论。
第 2 行代码查看了 BJsales 中处于 85%、90% 和 95% 这三个位置的元素,通过设
定 c 函数给出的分位数位置,quantile 函数可以查看处于任意百分位处的元素。显然,中位数是分位数的一个特例。
众数是一个较为特殊的统计量,它代表数据集中出现次数最多的数。将数据集中的数
据按照出现次数的多少顺序排列后,我们能够大致地看出数据集的分散程度。然而由于R
中浮点数的小数位很长,因此,统计每个值出现的次数并找出众数是不太可能的。R中并
没有计算众数的函数,不过在一些绘图函数中,众数被可视化地表达了出来。
2.2 度量数据集的分散程度
数据集的分散程度主要从方差、标准差、标准误、偏度系数和峰度系数等统计量加以
考量。本节仍旧使用了领先指标销售数据的数据集,其分析结果将和2.1节的结果互为佐证。
2.2.1? 极值、方差和标准差
极值、方差和标准差是较为常见的统计量,它们经常用于度量数据集的分散程度。
28
R 语言与大数据编程实战
R 中内置了好几种函数用以计算这些统计量。
> range(BJsales)
[1] 198.6 263.3
极值是对数据集的极小值和极大值的总称。在第 1 章中已经提到过 min 函数和
max 函数,它们分别给出数据集的极小值和极大值,与之类似地是 range 函数,它同
时给出两个极值。上述代码是对 BJsales 应用 range 函数的结果。另外,2.1 节中用于
计算分位数的 quantile 函数也能够用于计算极值。总的来说,range 函数是计算极值
时的首选。
极值具有容易理解的特点,但它也容易受异常值的影响。极值只能度量出数据集的
两端范围,刻画不出其他那些非极值点的密集程度和分布情况。因此,极值提供的信息
非常有限,它通常扮演着一个辅助分析的角色。
> var(BJsales)
[1] 461.3769
> sd(BJsales)
[1] 21.47969
方差是由统计学家规定的专门用于度量数据集分散程度的统计量,它的计算公式是
n
x x
n
1 i
2
i ∑ =
( )
,其中
x代表数据集的均值,n 则是数据集中数据的个数,在样本数据中为
了修正误差,分母也会写成 n–1,而非 n。从计算公式上看,方差计算的是数据集中全
部数据与均值的差方的和除以数据个数的值,这个公式同时受到全体数据的影响,方差
越大,则说明数据集中的数据离均值越远,数据越分散。
var函数能够计算数据集的方差(它默认的分母是n–1),由上述代码可知,BJsales
的方差是461.376 9,这是一个非常大的数,实际上它远远超过了BJsales的数据范围。为
了使度量分散程度的统计量更加易读,对方差进行开方即可得到数据集的标准差。sd函
数直接计算出了BJsales的标准差,显然,它和方差具有一个平方关系。标准差要比方差
小得多,比较标准差和数据集范围,能够较容易地看出数据的分散程度。
> c(mean(BJsales)-sd(BJsales),mean(BJsales)+sd(BJsales))
[1] 208.4983 251.4577
上述代码计算了BJsales中均值和方差的差值与和值,这两个数值恰好落在BJsales的
极值之间,实际上无论哪个数据集,均值和方差的差值与和值总是落在极值之间。比较差
值、和值与两个极值的差,如果差较大,数据就较集中;如果差较小,数据就较分散,观
察差值、和值与数据集的两个四分位数是否相似也能得出同样的结果。
除与数据集的其他内部数据进行比较外,方差和标准差也能和其他数据集的方差和
标准差进行比较。需要注意的是,方差和标准差的大小受量纲的影响,如果数据集中的
数据本来就比较大,那么方差和标准差也会比较大;如果数据集中的数据本来就比较小,那么方差和标准差也会比较小。因此不同量纲之间的方差和标准差是不能直接相比的,在比较前需要先对数据集进行标准化。29
第2章 原始数据的探索与预处理
2.2.2? 标准误和偏度系数、峰度系数
除极值、方差和标准差外,还有一些其他的统计量也可以用于度量数据的分散程度。
R 中并未为这些统计量一一编写现成的函数,有些统计量在使用时需要我们自己编写公
式进行计算,比如标准误、偏度系数、峰度系数就是三个需要用户自己编写公式的实用
统计量。
> error <- sqrt(var(BJsales)length(BJsales))
> error
[1] 1.753809
上述代码计算了 BJsales 的标准误。标准误的计算公式为
1 nn
xx
n
1 i
2
i ∑ =
( )
( )
,很明显,其中,1 n
xx
n
1 i
2
i ∑ =
( )
就是 var 函数的计算公式。因此只需计算 var 函数值与 BJsales 中数
据个数的差的开方,即可得到标准误。上述代码中第 1 行代码使用 length 函数计算了
BJsales 中数据的个数,并用 sqrt 函数实现了开方,由返回结果可知,BJsales 的标准误
为 1.753 809。
标准误和标准差是两个不同的概念,标准误的计算公式可简化为
n
s
,这与标准差
的公式显然不一样,标准误在标准差的基础上消去了数据量带来的影响,对数据量相差
较大的多个数据集来说,标准误更具有比较意义。
> skewness<-length(BJsales)sum((BJsales-mean(BJsales))^3)
+ ((length(BJsales)-1)(length(BJsales)-2)sd(BJsales)^3)
> skewness
[1] 0.2858044
偏度系数和峰度系数是两个衡量数据集的分布形状的系数。偏度系数的计算公式为
3
n
1 i
3
i
s 2 n 1 n
xxn
∑ =
( )
( ) ( )
,其中,s 代表数据集的标准差。这是一个很复杂的公式,上述代码使用
length 函数、sum 函数、mean 函数、sd 函数等多个函数完成了复杂的计算过程,R的返回结果显示BJsales 的偏度系数为 0.285 804 4。
偏度系数是一个取值通常在 –3~+3 之间的值,它衡量了数据集的对称程度。数据越
对称,偏度系数就越接近 0;数据越不对称,偏度系数就越远离 0。BJsales 的偏度系数
是正的,这表明BJsales 的右侧数据更分散,否则,它的偏度系数将是负的。
> m<-mean(BJsales)
> n<-length(BJsales)
> s<-sd(BJsales)
30
R 语言与大数据编程实战
> kurtosis<-(n(n+1)sum((BJsales-m)^4))((n-1)(n-2)(n-3)s^4)-
(3(n-1)^2((n-2)(n-3)))
> kurtosis
[1] -1.526321
峰度系数的计算公式更为复杂,3 n 2 n
1 n 3
s 3 n 2 n 1 n
x x 1 n n 2
4
n
1 i
4
i
× ∑ =
( )
( )( )
( )
( ) ( )
( )
( )
是它的具体表达形式,为了减少编程量,上述代码中首先设置了三个辅助变量,而后使用这三个辅助变量进行
了计算。显然,这种编程方式的易读性更强,写起来也更方便。
由 R 的返回结果可知,BJsales 的峰度系数为 –1.526 321。峰度系数由数据集的四
阶矩计算得到,正态分布的峰度系数为 3,不过上述代码的计算公式中已减去 3,因此,只需将峰度系数与0 进行比较即可得知数据集的分布峰度与正态分布的相似程度。峰度
系数越接近 0,数据集的分布峰度就与正态分布越相似;峰度系数越远离0,数据集的
分布峰度就与正态分布越不相似。BJsales 的峰度系数为负,这表明 BJsales 中的数据较
为集中,两侧数据较少 ;否则,BJsales 的峰度系数将为正。
正态分布具有良好的性质,因此我们总是希望数据集的分布尽可能地接近正态分布。
偏度系数和峰度系数就是这样两个实用的函数,显然,当偏度系数和峰度系数都为0 时,数据集就服从一个标准的正态分布。
除标准误、偏度系数、峰度系数外,还有极差、变异系数、样本校正平方和等许多
有用的统计量,其中的大部分统计量 R 都没有为它们提供单独的函数,我们在使用这些
统计量时可以自己编写函数,或者安装 R 中附带了这些函数的包。另外,有些数值摘要
表中提供了这些统计量,也可以从数值摘要表中查询统计量的值。
2.3 创建一个数值摘要表
之前两个小节介绍了好几种在探索数据时常用的统计量,这些统计量共同刻画出数
据的大致轮廓,自然的,如果有一个函数能够将这些统计量汇总起来,这将创造极大的
方便。实际上,这种函数已经存在于R中,它们能够创建包含多个统计量的数值摘要表,为了展示数据汇总函数在数据框上的效果,本节使用attenu数据集作为示例。
> library(datasets)
> head(attenu)
event mag station dist accel
1 1 7.0 117 12 0.359
2 2 7.4 1083 148 0.014
3 2 7.4 1095 42 0.196
4 2 7.4 283 85 0.135
5 2 7.4 135 107 0.062
6 2 7.4 475 109 0.054
在 R 中加载 dataset 包后,attenu 数据集即可直接调用。attenu 是一个与 Joyner-31
第2章 原始数据的探索与预处理
Boore 衰变系数有关的数据集,使用 head 函数查看 atteun 的前 6 行数据,由 R 的返回
结果可知 attenu 中有 5 个变量,其中,event 存储了事件标签信息,mag 存储了镁信息,station存储了观察站点信息, dist存储了距离信息, accel存储的则是时间调整信息。显然,它们都是数值型的。
> ?venum(attenudist)
[1] 0.5 11.1 23.4 47.7 370.0
> summary(attenu)
event mag station dist
Min. : 1.00 Min. :5.000 117 : 5 Min. : 0.50
1st Qu.: 9.00 1st Qu.:5.300 1028 : 4 1st Qu.: 11.32
Median :18.00 Median :6.100 113 : 4 Median : 23.40
Mean :14.74 Mean :6.084 112 : 3 Mean : 45.60
3rd Qu.:20.00 3rd Qu.:6.600 135 : 3 3rd Qu.: 47.55
Max. :23.00 Max. :7.700 (Other):147 Max. :370.00
NA's : 16
accel
Min. :0.00300
1st Qu.:0.04425
Median :0.11300
Mean :0.15422
3rd Qu.:0.21925
Max. :0.81000
R 提供了两个基础的数值摘要表函数: ?vesum 函数和 summary 函数。其中
venum 函数只作用于向量,summary 函数既可以作用于向量,也可以作用于数据
框。上述代码对 attenu 中的 dist 向量应用了 ?venum 函数,对 attenu 应用了 summary
函数。?venum 函数返回了向量的两个极值、两个四分位数和均值。该函数能够实现与
quantile 函数相同的效果,但?venum 函数的执行速度要快一些。summary 函数的返
回结果在 ?venum函数的基础上增加了一个中位数统计量。
R 控制台返回了 event、mag、dist 和 accel 变量的 6 个统计量,在 station 变量下则
返回了一些其他数值。这是由于 station 是一个因子变量,因此 summary 函数返回了
station 中出现次数最多的 5 个因子,并注明了其他因子总共出现了多少次,以及空缺值
的个数。在 R 控制台中输入 class(attenustation)可以查看 station 的类型,输入 ?factor可
以获取有关因子类型的更多信息。
> alldata <- function(x){
+ var <- var(x)
+ sd <- sd(x)
+ med ......
您现在查看是摘要介绍页, 详见PDF附件(7604KB,321页)。





