-
- R语言基础
R语言是一个体系庞大的应用软件,主要包括核心的R标准包和各专业领域的其他包。本书采用原理加示例的方式来对R语言相关函数进行介绍。本章主要对R语言的基本信息、R软件和RStudio的安装及升级、常用包的安装与加载,以及R包内置数据集进行简单介绍。
1.1.1 认识 R 语言
1.1.1.1 R语言的基本信息
R 语言是一种为统计计算和图形显示而设计的语言环境,是贝尔实验室(BellLaboratories)的Rick Becker、John Chambers和Allan Wilks开发的S语言的一种实现,提供了一系列统计和图形显示工具。R语言是面向对象的一种编程语言,也是一套开源的数据分析解决方案,由一个庞大且活跃的全球性研究型社区维护。它具有下列优势。
1、R语言是完全免费的统计分析软件,可以在不同的平台上运行,包括Windows、UNIX、Mac OS和Linux。
2、R语言可以轻松地从各种类型的数据源读写数据,包括带分隔符的文件、统计软件、数据库管理系统,以及专门的数据仓库。几乎所有类型的数据都可以用R语言进行分析统计。
3、R语言的优势主要体现在其软件包生态系统具有较高的开放性(即免费开源)。R语言不仅提供功能丰富的内置函数供用户调用,也允许用户编写自定义函数来扩充功能。读者无须申请权限即可直接查看软件包或程序包的源码,并且对其进行拓展。如果某项统计技术已经存在,那么必然存在着一款R软件包与之对应。
4、R语言是有顶尖水准的制图功能。R语言的拓展包中dplyr与ggplot2可分别用于数据处理与绘图,且能够非常直观地提升用户对数据的理解。
1.1.1.2 R语言的编辑窗口
R语言的编辑窗口与其他编程软件类似,由菜单栏和快捷按钮组成。快捷按钮下面的窗口便是命令输入窗口,它也是部分运算结果的输出窗口,有些运算结果则会在新建的窗口中输出。主窗口上方的一些文字是刚运行R语言时出现的一些说明和指引,文字下的“>”符号便是R语言的命令提示符,在其后可输入命令。
R语言一般采用交互式工作方式,在命令提示符后输入命令,按“Enter”键后便会输出计算结果。当然,也可将所有的命令存储在一个文件中,运行这个文件的全部或部分来执行相应的命令,从而得到相应的结果。
菜单栏位于工作环境的最上方。文件菜单可以实现的功能有输入R语言代码、建立新的程序脚本、打开程序脚本、显示文件、载入工作空间、保存工作空间、载入历史、保存历史、改变当前目录、打印、保存到文件及退出。编辑菜单可以实现复制、粘贴、清除控制台和数据编辑等功能。查看菜单可以选择是否显示工具栏。其他菜单可以实现中断目前计算、缓冲输出及列出目标对象等功能。程序包菜单可以实现载入程序包、设定CRAN镜像、安装及更新程序包等功能。窗口菜单可以将所有窗口层叠或者平铺。帮助菜单提供R语言的常见问答和帮助途径。当执行不同的窗口操作时,菜单的内容就会发生变化。如打开R语言文件或一个编写好的R语言函数后,菜单栏就会缺失查看、其他两个菜单选项。
工具栏从左至右可以依次进行打开程序脚本、载入映像、保存映像、复制、粘贴、刷新、终止目前计算及打印的操作。当打开R语言文件或一个编写好的R语言函数时,工具栏会发生相应的变化,此时的快捷按钮从左至右依次为打开程序脚本按钮、保存映像按钮、运行当前行代码或所选代码按钮、返回主界面按钮及打印按钮。
命令窗口是R语言进行工作的窗口,也是实现R语言各种功能的窗口,其中的“>”是命令提示符,表示R语言处于准备编辑的状态。读者可以直接在命令提示符后输入命令语句,按“Enter”键执行。
R语言是一种基于对象(Object)的语言,所以在R语言中接触的每样东西都是一个对象,一串数值向量是一个对象,一个函数是一个对象,一个图形也是一个对象。基于对象的编程(Object Oriented Programming,OOP)就是在定义类的基础上创建与操作对象的。
需要特别说明的是,在R语言中,赋值符号一般采用“<”,表示将右边的内容赋值给左边的变量。同样的,R语言还提供反向赋值的功能,如下面的代码所示。但注意,在函数的参数设置里面要用等号。R语言允许使用“=”为对象赋值,但是它不是标准语法,在某些情况下用等号赋值会出现问题。
> a <- 'Hello world!’
> a
[1]“Hello world!”
> 'Hello world!'-> b
> b
[1] "Hello world!"
> plot(1:10, col='red')#此时,参数设置使用“=”
1.1.2 R语言的编译环境
R语言的原始编译窗口较为简单,提供的编译环境不太友好,所以为了提高代码的编写效率,选择RStudio作为代码编译环境。
1.1.2.1 R语言的编译器
只使用R语言自带的GUI(Graphical User Interface,图形用户界面)难以进行方便快捷的操作,因此为了方便使用,可以使用免费的图形界面编辑器 RStudio。RStudio实质性的编程语言与R语言没有任何区别。但是相比R语言,RStudio拥有更友好的界面及更强的操作性。
1、 RStudio 的下载
可以从网站http://www.rstudio.com/products/rstudio/download/中获取相关资源后下载。要注意的是,商业版及专业版的RStudio编辑器是收费的,但是就本书内容而言,开源的RStudio就能够满足编程需求。
请同学们根据自身所使用的计算机操作系统(Linux、Mac OSX和Windows)选择系统支持的版本,自行下载安装,但要注意,在选择安装目录时,需要选择安装R的目录里面,以免发生RStudio无法找到R关联的问题。
安装 RStudio后,可从安装目录或者“开始”菜单栏中启动。
2、RStudio的编辑窗口
RStudio的操作窗口主要由菜单栏、快捷键工具栏、脚本编写窗口、环境管理窗口、代码命令行窗口及资源管理窗口构成。其中,脚本编写窗口、环境管理窗口、代码命令行窗口的位置,以及资源管理窗口的大小可通过拖动鼠标来改变。
首先介绍菜单栏的功能。菜单栏包含File(文件)、Edit(编辑)、Code(编码)、View(视图)、Plots(绘图)、Session(会话)、Build(搭建)、Debug(调试)、Profile(项目)、Tools(工具)及Help(帮助)菜单。
(1)File(文件)菜单提供了R脚本及工程的创建、打开与保存功能。
(2)Edit (编辑)菜单与普通的编辑菜单类似,提供代码的复制、粘贴等功能。
(3)Code (编码)菜单包含了简单的代码块创建、注释与取消注释、运行等功能。
(4)View(视图)菜单主要提供了各个窗口的切换及设置等功能。
(5)Plots(绘图)菜单只有图片产生时才可用,其功能其实与图1-20中的6部分中的Plots差不多。
(6)Session(会话)菜单提供了RStudio与R之间连接设置的功能,如重新连接R、终止R连接等。
(7)Build(搭建)菜单主要在RStudio中进行Package等开发时需要编译的情况下使用,普通的R脚本是不需要的。
(8)Debug(调试)菜单用于对RStudio中编程文件的调试。
(9)Profile(项目)菜单提供R脚本归总到项目的功能。
(10)Tools(工具)菜单提供了很多实用功能,主要有数据集的导入、Package的安装与升级、DOS形式的R命令行界面及全局设置。
(11)Help(帮助)菜单提供了R与RStudio的使用帮助。
这里介绍 Tools(工具)下的全局设置(Global Options)子菜单。全局设置(Global Options)子菜单提供了有关RStudio的一些基本的设置(General)有默认的文本编码模式,推荐使用UTF-8。Code提供了一些关于编码的外观等设置,如是否显示行号、“Tab”键的空格数等。Appearance用于设置RStudio的外观,如字体、大小主题等。Pane Layout可配置RStudio界面上各窗口的布局。Packages配置的是Packages下载镜像及一些与Packages开发相关的设置。Sweave与产生帮助文档相关。Spelling与编码拼写检查相关。Git/SVN可设置在RStudio中使用Git等版本控制程序。
快捷键工具栏提供了常用操作的工具按钮。
脚本编写窗口是R语言脚本文件的编辑区域。代码编辑区域上方提供了代码保存、运行光标所在行或选定区域的代码、运行整个脚本代码等功能的工具。
在环境管理窗口中可查看代码运行产生的工作变量、代码的运行记录及RStudio的相关连接。
代码命令行窗口与R的编辑窗口类似,主窗口上方的一些文字是刚运行R时出现的一些说明和指引,文字下的“>”符号便是R的命令提示符,在其后可输入命令。
资源管理窗口下的Files子窗口提供了对项目中的内容进行文件夹的创建、删除、重命名、复制、移动等操作,方便管理项目。Plots子窗口提供了图片的浏览、放大、导出与清理的功能。Packages子窗口提供了R包的安装、加载、更新等提作功能。而Help子窗口提供了函数的帮助文档的查找与展示的功能。
3、RStudio的常用快捷键
RSudio有一些常用快捷键,掌握这些快捷键可以提高编码效率。
(1)Cm-R:可以替代Run的功能,执行选中的多行或者光标所在单行的代码。
(2)Crl+Shift+N:创建空白文本。
(3)Ctrl+O:打开文件选择器。
(4)Ctrl+L:清除R命令行控制台的屏幕内容。
(5)Crl+Shift+R:在光标行插入section标签。
(6)Ctrl+Shift+C:将选择的程序行进行批量注释。
(7)Crl+W:关闭当前脚本文件。
1.1.2.2获取R语言的帮助
R语言提供了大量的帮助文档,若学会使用这些帮助文档,则有助于正确使用各种函数,提高编程能力。R语言的内置帮助系统提供了当前已安装的R包中所有函数的描述、使用方法、参数介绍、函数细节及相关的函数例子。
在命令窗口输入表1-1中列出来的命令即可查看帮助文档。
表1-1 R语言的获取帮助命令
命令 | 功能 |
help.start() | 打开帮助文档 |
help("plot") 或者 ?plot | 查看plot函数的帮助(引号可以省略) |
help.search("plot") 或者 ??plot | 以plot为关键词搜索本地帮助文档 |
example("plot") | plot函数的使用示例(引号可以省略) |
RSiteSearch("plot") | 以plot为关键词搜索在线文档和邮件列表存档 |
apropos("plot",mode="function") | 列出名称中含有plot的所有可用函数 |
data() | 列出当前已加载包中所含的所有可用示例数据集 |
vignette() | 列出当前已经安装的包中所有可能的vignette文档 |
vignette("plot") | 为主题plot显示指定的vignette文档 |
而在RStudio中,资源管理窗口的Help子窗口则可以直接通过函数的输入来查看相关的帮助文档。
1.2.2.3了解R语言的工作空间
工作空间(Workspace)是R当前的工作环境,存储了用户定义的所有对象(向量、矩阵、列表、数据框、函数)。在RStudio中的环境管理窗口中可以直观地看到R的工作空间中存储的对象。
在一个R对话结束的时候,可以把当前工作空间保存到当前工作路径的镜像(.Rhistory文件)中,并在下一次启动RStudio的时候自动载入该镜像文件保存的工作空间。
当前工作路径(Working Directory)是指R用来读取文件和保存结果的默认路径。可以通过getwd函数来查看当前工作目录,也可以通过setwd函数设置当前工作路径。如果需要读取一个不在当前工作路径中的文件,则用户可以在调用语句中输入完整的文件路径,也可以更改当前工作路径,然后读取文件。
常见的用于管理工作空间的R语言命令如表1-2所示。
表1-2 R的工作空间管理命令
命令 | 功能 |
Getwd() | 显示当前的工作目录 |
setwd("new_path") | 修改当前的工作目录为new_path |
1s() | 列出当前工作空间中的对象 |
rm(objectList) | 移除(删除)一个或多个对象 |
rm(list=1s()) | 移除当前工作空间的所有对象,即清除R工作空间中的内存变量 |
help(options) | 显示可用选项的说明 |
options() | 显示或设置当前选项 |
history(n) | 显示最近使用过的n个命令(默认值为25) |
savehistory("myfile") | 保存命令历史文件到myfile中(默认值为.Rhistory) |
loadhistory("myfile") | 载入一个命令历史文件(默认值为.Rhistory) |
Save.image("myfile") | 保存工作空间到文件myfile中(默认值为.RData) |
save(objectlist,file="myfile") | 保存指定对象到一个文件中 |
load("myfile") | 读取一个工作空间到当前会话中(默认值为.RData) |
q() | 退出R,并会询问是否保存工作空间 |
1.1.3 使用R包
之前在介绍R语言的时候,就提及R的优势主要体现在其软件包生态系统上,即常说的R包。截至2017年10月,R已提供11601个包供用户免费安装加载,具体的R包在官网(https://cran.r-project.org/web/packages/available_packages_by_name.html)上。这些R包提供了涉及各个领域的强大的功能,包括数据读取、可视化绘图、计算统计等。正因为R包的跨度非常大,所以R语言如此流行。
1.1.3.1认识R包
R包(Package)是R函数、数据、预编译代码以一种定义完善的格式组成的集合。而R包储存的文件夹称为库(Library)。可以通过 .libPaths 函数进行库的路径查询,而library函数不仅可以显示库中有哪些包,还可以载入所下载的包,进而在会话中使用包,如下代码所示。
>.libPaths()
[1]"C:/2rogramFiles/R/R-3.4.2/1ibrary"
library()
通过R包的查询,同学们可以看到R语言自带的一系列R包(base、datasets、utilsgrDevices、graphics、stata 及 methods)。这些包提供了各种各样的函数和内置数据集。其他的R包则需要自行安装加载。
1.1.3.2 安装与加载R 包
要使用R包里的函数必须先加载相应的R包。可以通过install.packages函数来下载和安装包,然后通过library函数加载相应的包,如下代码所示。
>install.packages('nnet')
Installing package into 'c:/Users/tipdm/Documents/R/win-library/3.4’(as 'lib' is unspecified)
trying URL 'https://cran.rstudio.ccm/bin/windows/contrib/3.4/nnet 7.3-12.zip’
Content type ‘application/zip' length 134954 bytes (131 KB)
downloaded 131 KB
package 'nnet' successfully unpacked and MD5 sums checked
The downloaded binary packages are in
C:\Users\tipdm\AppData\Local\Temp\Rtmps 3xg7\downloaded_packages
>library(nnet)
还可以通过RStudio的图形界面来实现包的加载。
单击“Install”按钮,在弹出安装对话框后,可以选择安装来源和安装路径,这与install.packages 函数效果一致。单击“Update”按钮则可对已经安装的包进行更新。再勾选R包前面的复选框即可加载相应的包,效果同library函数。
1.1.3.3 掌握常用的R包
在数据分析中,常用的R包可划分为空间数据分析类、机器学习与统计学习类、多元统计类、药物动力学数据分析类、计量经济类、金融分析类、并行计算类和数据库访问类。比如,机器学习与统计学习类就包含实现分类、聚类、关联规则、时间序列分析等功能的R包。加载不同的R包能够实现相应的数据挖掘功能,如表1-3所示。
表1-3 R数据挖掘相关包
功能 | 函数及加载包 |
分类与预测 | nnet函数需要加载BP神经网络nnet包 randomForest函数需要加载随机森林randomForest包 svm函数需要加载e1071包 tree函数需要加载CRAT决策树tree包等 |
聚类分析 | hclust函数、kmeans函数在stats包中 |
关联规则 | apriori函数需要加载arules包 |
时间序列 | arima函数需要加载forecast、tseries包 |
分类与预测是数据挖掘领域研究的主要问题之一,而分类器作为解决问题的工具一直是研究的热点。常用的分类器有神经网络、随机森林、支持向量机、决策树等。这些分类器都有各自的性能特点。
nnet包执行单隐层前馈神经网络,nnet函数的主要参数有隐层结点数(size)、结点权重(weights)、最大迭代次数(maxit)等。为了达到最好的分类效果,需要根据经验或者不断地尝试来确定。
随机森林分类器利用基于Breiman随机森林理论的R语言软件包randomForest中的randomForest函数来实现,需要设置3个主要的参数:森林中决策树的数量(tree)、内部结点随机选择属性的个数(mtry)及终结点的最小样本数(nodesize)。
支持向量机(Support Vector Machine, SVM)分类器采用R语言软件包e1071实现。该软件包是以中国台湾大学林智仁教授的libsvm源代码为基础开发的。svm函数提供了与LIBSVM的接口,主要参数有类型(type,“C”实现支持向量机分类,“eps-regression实现支持向量机回归)、核函数(kernel)。SVM包含了4种主要的核函数:线性核函数(Linear)、多项式核函数(Polynomial)、径向基核函数(RBF)及Sigmoid核函数。而径向某核函数支持向量机包含两个重要的参数:惩罚参数(Cost)和核参数(Gamma)。 tune数可以对两者进行网格寻优(Grid-search),以确定最优值。
常用的聚类方法有系统聚类与k-means聚类。系统聚类可以使用hclust函数实现,参数有距离矩阵(d)和系统聚类方法(method),其中,距离矩阵可以使用dist函数求得。常用的系统聚类方法有最短距离法、最长距离法、类平均法、中间距离法、重心法及Ward法。k-means聚类法是一种快速聚类法,可以使用kmeans函数实现,涉及的主要参数为聚类数。
系统聚类法和k-means 聚类法的不同之处在于:系统聚类对不同的类数产生一系列的聚类结果,而 k-means聚类法只能产生指定类数的聚类结果。具体类数的确定,离不开实践经验的积累。有时也可借助系统聚类法,以一部分样本为对象进行聚类,其结果作为k-means聚类法确定类数的参考。
作为数据挖掘中的一个独立课题,关联规则用于从大量数据中挖掘出有价值的数据项之间的关系,常用的有arules包中的Apriori算法。使用Apriori算法生成规则前,要把数据转换为transcation格式,这可以通过as函数实现,其中涉及的参数列表(parameter)用于自定义最小支持度与置信度。
时间序列分析是根据系统观测得到的时间序列数据,通过曲线拟合及参数估计来建立数学模型的理论和方法。进行时间序列分析时,可以使用ts函数将数据转换成时间序列格式;模型拟合可以通过arima函数实现,涉及的主要参数有order(自回归项数、滑动平均项数及使时间序列成为平稳序列的差分阶数)、seasonal(序列表现出季节性趋势时需要用到,除了上述order内容外,还有季节周期period)、method(参数估计方法,“CSS”为条件最小二乘法,“ML”为极大似然法)等。
1.1.4 R包的内置数据集
数据集及数据集的描述如表1-4所示:
表1-4 数据集及数据集的描述
数据集 | 描述 |
airquality | 纽约1973年5~9月每日空气质量评估 |
attenu | 多个观测站观测到的加利福尼亚的23次地震数据 |
beaver1(beavers) | 一只海狸每10min的体温数据,共114条数据 |
beaver2(beavers) | 另一只海狸每10min的体温数据,共100条数据 |
cars | 20世纪20年代,汽车的速度与刹车距离 |
chickwts | 不同饮食种类对小鸡体重的影响 |
esoph | 喝酒、吸烟对食管癌的影响 |
faithful | 一个间歇泉的暴发时间和持续时间 |
InsectSprays | 不同杀虫剂对昆虫数目的影响 |
iris | EdgarAnderson记录的3种鸢尾花形态数据 |
LifeCycleSavings | 50个国家的存款率 |
Longley | 强共线性的宏观经济数据 |
mtcars | 32辆汽车的11个指标数据 |
PlantGrowth | 3种处理方式对植物产量的影响 |
Pressure | 温度和气压 |
Puromycin | 两种细胞中辅因子浓度对酶促反应的影响 |
quakes | 1000次地震观测数据(震级>4) |
sleep | 两种药物的催眠效果 |
stackloss | 化工厂将氨转为硝酸的数据 |
swiss | 瑞士生育率和社会经济指标 |
ToothGrowth | VC剂量和摄入方式对豚鼠牙齿的影响 |
Trees | 树木形态指标 |
USArrests | 美国50个州的4个犯罪率指标 |
USJudgeRating | 43名律师的12个评价指标 |
warpbreaks | 织布机异常数据 |
women | 15名美国女性的身高和体重情况 |