R语言编程:基于tidyverse
上QQ阅读APP看书,第一时间看更新

前言

R语言是以统计和分析见长的专业的编程语言,具有优秀的绘图功能,且开源免费,有丰富的扩展包和活跃的社区。R语言的这些优质特性,使其始终在数据统计分析领域的SAS、Stata、SPSS、Python、Matlab等同类软件中占据领先地位。

R语言曾经最为人们津津乐道的是Hadley开发的ggplot2包,其泛函式图层化语法赋予了绘图一种“优雅”美。近年来,R语言在国外蓬勃发展,ggplot2这个“点”自2016年以来,已被Hadley“连成线、张成面、形成体(系)”,从而形成了tidyverse包。该包将“数据导入、数据清洗、数据操作、数据可视化、数据建模、可重现与交互报告”整个数据科学流程整合起来,以“现代的”“优雅的”方式和管道式、泛函式编程技术实现。不夸张地说,用tidyverse操作数据比pandas更加好用、易用!再加上可视化本来就是R所擅长的,可以说R在数据科学领域不次于Python。

这种整洁、优雅的tidy流,又带动了R语言在很多研究领域涌现出一系列tidy风格的包:tidymodels(统计与机器学习)、mlr3verse(机器学习)、rstatix(应用统计)、tidybayes(贝叶斯模型)、tidyquantmodeltime(金融)、fpp3timetk(时间序列)、quanteda(文本挖掘)、tidygraph(网络图)、sf(空间数据分析)、tidybulk(生物信息)、sparklyr(大数据)等。

在机器学习和数据挖掘领域,曾经的R包总是在单打独斗,如今也正在从整合技术方面迎头赶上Python,出现了tidy风格的tidymodels包,以及新一代的用于机器学习的mlr3verse包,这些包基于R6类面向对象、data.table神速数据底层和开创性的Graph-流模式(图/网络流有别于通常的线性流)。

写作本书的目的

我发现近几年出现的R语言新技术很少有人问津,绝大多数R语言的教师和学习者,以及教材、博客文章仍在沿用那些过时的、晦涩的R语法,对R语言的印象仍停留在几年前:语法晦涩难懂、速度慢,做统计分析和绘图还行,没有统一的机器学习框架,无法用于深度学习、大数据、工业部署等。

有感于此,我想写一本用新R的技术,方便新手真正快速入门R语言编程的书,来为R语言正名。我是一名大学数学教师,热爱编程、热爱R语言,奉行终身学习的理念,一直喜欢跟踪和学习新知识、新技能。我对编程和R语言有一些独到的理解,因为我觉得数学语言与编程语言是相通的,都是用语法元素来表达和解决问题,我想把这些理解和体会用简洁易懂的方式表达出来。

希望这本书能让你学到正确的编程思想,学到新的R语言编程知识和编程思维,能真正让你完成R语言入门或将R知识汰旧换新。

本书的目标读者

没有R语言基础,想要系统地学习R语言编程,特别是想要学习新兴R技术的人。

具备一定的R语言基础,想升级R语言编程技术的人。

想要理解编程思想,锻炼向量化编程思维、函数式编程思维,以及想要真正掌握数据思维的人。

想要以R语言为工具,从事统计分析、数据挖掘、机器学习工作的人,特别是想学习使用机器学习包(tidymodelsmlr3verse)的人。

高校里对R语言及相关课程有需求的师生及科研人员,特别是将来想要在时间序列、金融、空间数据分析、文本挖掘等领域使用fpp3modeltimetidyquantsfquanteda等包的人。

本书特色

1.内容新颖

本书绝大部分内容参考新版本R包的相关文档,全面采用新的R语言技术编写,特别强调“整洁流、管道流、泛函流”数据科学思维(tidyverse)。

2.真正融入编程思维

很多R语言编程书只是罗列编程语法,很难让初学者学透它们。本书真正融入编程思维:由编程思想引导,了解编程语法到底是怎么回事,应该用于何处以及怎么使用。

3.精心准备实例

讲解编程语法必须配以合适的实例来演示,也建议读者一定要将编程语法讲解与配套实例结合起来阅读,比起将实例代码调试通过,更重要的是借助实例代码透彻地理解编程语法所包含的编程思维。本书后半部分是R语言在应用统计、探索性数据分析、文档沟通方面的应用,所配案例力求能让读者上手使用。

4.程序代码优雅、简洁、高效

本书程序代码都是基于tidyverse编写的,自然就很优雅。此外,本书尽量采用向量化编程和泛函式编程,更体现其简洁、高效。可以说,读者如果用这本书入门R语言,或者更新你的R知识库,就会自动跳过写烦琐、低效代码的阶段,直接进入“高手级”的行列。

本书内容安排

本书的结构是围绕如何学习R语言编程来展开的,全书内容共分为6章。 冯国双老师在《白话统计》中写道:

“一本书如果没有作者自己的观点,而只是知识的堆叠,那么这类书是没有太大价值的。”

尤其在当前网络发达的时代,几乎任何概念和知识点都可以从网络上查到。但有一点你很难查到,对于编程书来说,那就是编程思维。本书最大的特点之一就是无论是讲编程思想还是讲编程语法知识点,都把编程思维融入进去。

很多人学编程始终难以真正入门,学习编程语言要在编程思想的指导下才能事半功倍。本书的导语就先来谈编程思维,包括如何理解编程语言,用数学建模的思维引领读者从理解实际问题到自己写代码解决问题,了解R语言的编程思想(面向函数、面向对象、面向向量)。

第1章讲述R语言编程的基本语法,同时涉及向量化编程、函数式编程。这些语法在其他编程语言中也是相通的,包括搭建R语言环境以及常用数据结构(存放数据的容器),例如向量、矩阵、数据框、因子、字符串(及正则表达式)、日期时间,此外还涉及分支结构、循环结构、自定义函数等。这些基本语法是编写R代码的基本元素,学透它们非常重要,只有学透它们才能将其任意组合、恰当使用,以写出解决具体问题的R代码。同样是讲R语言的基本语法,本书的不同之处在于,用tidyverse中更一致、更好用的相应包加以代替,例如用tibble代替data.frame、用forcats包处理因子、用stringr讲字符串(及正则表达式)、用lubridate包讲日期时间、在循环结构中用purrr包的map_* 函数代替apply系列函数,另外还特别讲到泛函式编程。

第2章正式进入tidyverse核心部分,即数据操作。本章侧重讲解数据思维,先简单介绍tidyverse包以及编程技术之管道操作,接着围绕各种常用数据操作展开,包括数据读写(各种常见数据文件的读写及批量读写、用R连接数据库、中文编码问题及解决办法),数据连接(数据按行/列拼接、SQL数据库连接),数据重塑(“脏”数据变“整洁”数据,长宽表转换、拆分与合并列),数据操作(选择列、筛选行、对行进行排序、修改列、分组汇总)、其他数据操作(按行汇总、窗口函数、滑窗迭代、整洁计算),以及data.table基本使用(常用数据操作的dplyr语法与data.table语法对照)。tidyverse最大的优势就是以“管道流”和“整洁语法”操作数据,这些语法真正让数据操作从Base R的晦涩、难记、难用,到tidyverse的“一致”“整洁”、好记、好用,甚至比Python的pandas还好用!为了最大限度地降低理解负担,本书特意选用中文的学生成绩数据作为演示数据,让读者只关心语法就好。另外,tidyverse的这些数据操作,实际上已经在语法层面涵盖了日常Excel数据操作、SQL数据库操作,活用tidyverse数据操作语法已经可以完成很多常见任务。

第3章,可视化与建模技术。可视化只介绍流行的可视化包ggplot2,先从ggplot2的图层化绘图语法开始,依次介绍ggplot2的几大部件:数据、映射、几何对象、标度、统计变换、坐标系、位置调整、分面、主题、输出;接着介绍功能上的图形分类:类别比较图、数据关系图、数据分布图、时间序列图、局部整体图、地理空间图和动态交互图,对每一类图形分别选择其中有代表性的用实例加以演示。建模技术包括三项内容:(1)用broom包提取统计模型结果为整洁数据框,方便后续访问和使用;(2)modelr包中一些有用的辅助建模函数;(3)批量建模技术,例如要对各地区的数据分别建立模型、提取模型结果,当然这可以用for循环实现,但这里采用更加优雅的分组嵌套以及mutate+map_*实现。

第4章,应用统计。R语言是专业的统计分析软件,广泛应用于统计分析与计算领域。本章将从4个方面展开:(1)描述性统计,介绍适合描述不同数据的统计量、统计图、列联表;(2)参数估计,主要介绍点估计与区间估计,包括用Bootstrap法估计置信区间,以及常用的参数估计方法(最小二乘估计、最大似然估计);(3)假设检验,介绍假设检验原理,基于理论的假设检验(以方差分析、卡方检验为例,并用整洁的rstatix包实现),以及基于重排的假设检验(以t检验为例,用infer包实现);(4)回归分析,从线性回归原理、回归诊断,借助具体实例讲解多元线性回归的整个过程,并介绍广泛应用于机器学习的梯度下降法以及广义线性模型原理。

第5章,探索性数据分析。主要讨论三方面内容:(1)数据清洗,包括缺失值探索与处理、异常值识别与处理;(2)特征工程,包括特征缩放(标准化、归一化、行规范化、数据平滑)、特征变换(非线性特征、正态性变换、连续变量离散化)、基于PCA的特征降维;(3)探索变量间的关系,包括分类变量之间、分类变量与连续变量之间、连续变量之间的关系。

第6章,文档沟通,讨论如何进行可重复研究,用R Markdown家族生成各种文档,介绍R markdown的基本使用,R与Latex交互编写期刊论文、PPT、图书、R与Git/GitHub交互进行版本控制、用R Shiny轻松制作交互网络应用程序(Web App)以及开发和发布R包的工作流程。

附录部分是对正文内容的补充和扩展,分别介绍R6类面向对象编程、错误与调试、用R实现Excel中的VLOOKUP与透视表、非等连接与滚动连接、R与网络爬虫、R与高性能计算、R机器学习框架—mlr3versetidymodels

大家可以根据自己的需求选择阅读的侧重点,不过我还是希望你能够按照顺序完整地阅读,这样才能彻底地更新一遍你的R知识,避免将Base R与tidyverse混用,因为二者在编写R代码时不是一种思维,强行搭在一起反而效率低。

本书所用的软件

本书在编写时,使用当时最新的R语言版本4.2.2和RStudio-2022.07.2-576,使用的R包主要是tidyverse 1.3.2系列。

本书的配套资源下载

本书的R程序均作为R markdown中的代码调试通过,所有示例的数据、R程序、教学PPT都可以在异步社区官网、GitHub(https://github.com/zhjx19/introR)、码云(https://gitee.com/zhjx19/introR)下载。

致谢

感谢Hadley的《R数据科学》(R for Data Science)一书让我实现了tidy方式的数据科学入门;感谢Desi Quintans和Jeff Powell的Working in the Tidyverse一书让我真正开始对用tidyverse操作数据产生兴趣。也正是这些启蒙和启发令本书得以诞生。

感谢我的爱人及岳父岳母,在家庭生活方面给予我诸多照顾,让我能安心地创作;特别感谢我远在河北老家的母亲和弟弟,在我无能为力的时候,照顾生病住院和在家养病的父亲,免去了我的后顾之忧。

感谢Hadley开发的tidyverse包让R语言用起来如有神助,感谢谢益辉开发的rmarkdown/ bookdown帮助我高效地编写书稿,感谢黄湘云&叶飞整合的ElegantBookdown模板。

感谢知乎平台及知乎上的读者们,你们让本书有机会为广大的读者知晓。感谢“tidy-R”“Use R!”“数据之美”QQ群的群主和群里的很多朋友,大家一起学习R语言,一起解答问题,非常开心!也谢谢大家对我的支持以及对本书的期待,你们给了我写作的动力!谢谢群友们帮忙指出书中的错误,特别感谢好友楚新元、“随鸟走天涯”“庄闪闪”等,对本书部分章节中的内容给予很好的建议和很大的帮助。感谢“无安书”等人在“tidy-R”群热心解答群友问题。

感谢胡俊英编辑通过知乎平台找到我,并全力促成了本书的出版,为本书的出版做了大量认真细致的工作。感谢在工作和生活中帮助过我的领导、同事、朋友们,感谢你们,正是因为有了你们,才有了本书的面世。

本书是在黑龙江省哲学社科项目青年项目:全面二孩政策对黑龙江省人口的影响及对策研究(项目号:17TJC134)资助下完成,在此一并表示感谢!

关于勘误

虽然花了很多时间和精力去核对书中的文字、代码和图片,但因为时间仓促和水平有限,本书仍难免会有一些错误和纰漏。如果大家发现问题或有什么疑问,恳请反馈给我,也非常欢迎大家与我探讨R语言编程相关的技术,相关信息可发到我的邮箱zhjx_19@hrbcu.edu.cn,或者在本书的读者群“tidy-R语言2”QQ群(222427909)在线交流,也可以在我的知乎(知乎昵称“张敬信”)专栏相关文章下面评论或私信,我肯定会努力解答疑问或者指出一个正确的方向。