2.1 开发环境准备和快速入门
2.1.1 R语言简介
R语言的前身是S语言,S语言是由AT &T Bell实验室的Rick Becker、John Chambers和Allan Wilks开发的一种用来进行数据探索、统计分析、作图的解释型语言。最初S语言的实现版本主要是S-PLUS。S-PLUS是一个商业软件,它基于S语言,并由MathSoft公司的统计科学部进一步完善。而R语言最初由来自新西兰大学的Ross Ihaka和Robert Gentleman开发(由于他们的名字都以R开头,所以该软件被命名为R)。因为R语言是基于S语言的一个GNU项目,所以也可以当作S语言的一种实现,通常用S语言编写的代码都可以不做修改地在R语言环境下运行。
R语言是一套开源的数据分析解决方案,几乎可以独立完成数据处理、数据可视化、数据建模及模型评估等工作,而且可以完美配合其他工具进行数据交互。具体来说,R语言具有以下优势:
1)R语言作为一种GNU项目,开放了全部源代码,用户可以免费下载使用和修改。
2)R语言可以运行在多种平台上,包括Windows、UNIX和Mac OS。
3)R语言可以轻松地从各种类型的数据源导入数据,包括文本文件、数据库管理系统、统计系统乃至Hadoop、Spark等。它同样可以将数据输出并写入这些系统中。
4)R语言内置多种统计学及数据分析功能。因为有S的血缘,所以R比其他统计学或数学专用的编程语言有更强的面向对象的功能。
5)R语言拥有顶尖的制图功能。不仅有 lattcie包、ggplot2包对复杂数据进行可视化,更有rCharts包、recharts包、plotly包实现数据交互可视化,甚至可以利用功能强大的shiny包实现R与Web整合部署,构建网页应用,帮助不懂CSS、HTML的用户利用R快速搭建自己的数据分析App应用。
当然,R语言也存在一些固有的缺点,目前主要的问题有如下三点:
1)R语言是一种解释型语言,和编程语言相比,速度显得略慢一些,但是随着硬件和R自身的发展,这个问题已经被慢慢弱化了,而且如果能够熟练运用向量化运算,可以大大提高速度,并且若使用R内置的分析函数,效率高很多,因为很多函数都是由C或者Fortran编写的。
2)R所有的计算实际是基于内存进行的,这就意味着,在处理数据的过程中,数据必须完整地装入内存当中,这在处理小型数据是没有任何问题的,但是当遇到大数据时,问题就会变得很严重。但是,这个问题也得到了一定的解决,可以利用并行包提升R的性能,或者利用R结合Hadoop的方式进行大数据分析工作。
3)由于R语言的自由,各种包的编写者来自不同的领域,所以在一定程度上是比较混乱的,没有统一的命名格式,参数格式不一,源代码和文档质量良莠不齐。
2.1.2 R的安装
截至目前(撰写本书时),R的最新版本是3.4.0,可以在CRAN(Comprehensive R Archive Network)获取最新版本。在https://www.r-project.org/页面点击download R可以进入CRAN镜像站地址https://cran.r-project.org/mirrors.html,其中包含中国大陆地区的7个镜像地址,你可以选择距离最近的地址进入其镜像的详细页面。此外,通过该页面可以下载Linux、MacOS和Windows操作系统的安装包。如果需要安装旧版的R,可以到https://cran.r-project.org/bin/下载对应的版本。
本书使用的是Windows操作系统下的R 3.2.2版本。直接双击下载好的R-3.2.2-win.exe进行安装即可。安装完成后,双击桌面图标启动R,打开如图2-1所示的界面。
R的界面相当简洁,只有为数不多的几个菜单栏和快捷按钮。快捷按钮下面是主控制台,它是输入脚本和执行结果窗口。
2.1.3 其他辅助工具
与传统的数据挖掘工具SAS、SPSS和IBM SPSS Modeler等软件相比,R的缺点在于没有友好的操作菜单,这会使很多熟悉其他工具的用户起初会觉得很困难。幸好,R自由的特性得到很好的发挥,有用户贡献的R包实现了很多功能的菜单化操作。下面介绍一个比较友好的编辑器和一个可以实现菜单化操作完成数据挖掘工作的包。
虽然现在有很多可用的IDE,但是现在最好用的应该是Rstudio,它是专门用于R语言环境的IDE。Rstudio可用于Windows、Mac和Linux,并且可以在Linux环境中安装Rstudio-Server,它允许用户通过一个Web浏览器的标准Rstudio界面来对RStudio进行多人协同操作。
RStudio可以从其官网https://www.rstudio.com/免费下载安装。一般情况下,下载安装桌面版即可。安装完启动RStudio的基本界面如图2-2所示。
左上方的窗口是文本编辑器,具有强大的功能,可以在文本编辑器写好脚本,单击Run按钮(或者利用Ctrl+R快捷键)批量运行代码;右上方的窗口包括当前环境下的信息、历史命令;左下方的窗口是标准的R控制台;右下方的窗口包括文件路径、绘图窗口、已经在本地安装的包信息、帮助文档以及交互绘图时的图形浏览界面。
Rattle是一个用于数据挖掘的R的图形交互界面(GUI),可用于快捷处理常见的数据挖掘问题。从数据的整理到模型的评价,Rattle给出了完整的解决方案。Rattle和R平台良好的交互性,又为用户使用R语言解决复杂问题开启了方便之门。Rattle易学易用,不要求很多的R语言基础,如今已被广泛应用于数据挖掘实践和教学之中。
Rattle初始界面如图2-3所示。
> library(rattle)
Rattle: A free graphical interface for data mining with R.
XXXX 4.1.0 Copyright (c) 2006-2015 Togaware Pty Ltd.
键入'rattle()'去轻摇、晃动、翻滚你的数据。
> rattle()
Rattle的标签栏已经集成数据导入、数据探索、数据检验、数据转化、数据建模及模型评估功能,可以通过鼠标单击的方式完成一整套的数据挖掘工作,并且可以利用Log日志查看每个操作的R脚本实现,借此来学习R语言的代码规范及编写。
2.1.4 R快速入门
R是一种区分大小写的解释型语言,程序内置的函数可以满足基本的数据分析需求,并有丰富的帮助文档帮助新手快速上手。此外,也有很多用户贡献了高质量的包,极大地扩展了R的功能,例如,用来进行数据处理的resharp2包、用来画图的ggplot2包和R与Web整合部署的shiny包。
1.新手上路
可以在命令提示符(>)后每次输入一条命令,或者一次性执行脚本文件里的一组命令。R语言是解释型语言,输入命令后可以实时响应,就好像计算器一样。
> 1+1
[1] 2
如果R监测到输入的命令行未结束,就会给出一个提示符“+”,提示要在下一行继续输入未完的命令,直到从语法角度来讲命令已经输入完整为止,不然R会有“unexpected end of input”的错误提示。
> 1+
+
错误: unexpected end of input
> 1+
+ 1
[1] 2
R语言的标准赋值符号是<-,也可以用=。例如,将序列1:10赋予对象a,可以执行如下操作。
> a = 1:10
此时,如果想查看对象a,直接输入小写a即可,但由于R是一种区分大小写的解释型语言,此时如果输入大写A,则会报错:
> a
[1] 1 2 3 4 5 6 7 8 9 10
> A
错误: 找不到对象'A'
不仅仅针对数据对象,对于其他对象,R也是区分大小写的。例如,R自带的一个求相关系数的cor函数,如果我们错写为Cor函数,则会出现“没有"Cor"这个函数”的错误提示。
> cor(iris[,1:4])
Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length 1.0000000 -0.1175698 0.8717538 0.8179411
Sepal.Width -0.1175698 1.0000000 -0.4284401 -0.3661259
Petal.Length 0.8717538 -0.4284401 1.0000000 0.9628654
Petal.Width 0.8179411 -0.3661259 0.9628654 1.0000000
> Cor(iris[,1:4])
错误: 没有"Cor"这个函数
2.获得帮助
R提供了大量的帮助文档,学会如何使用这些帮助文档可以让你快速上手。如果想知道某个函数或者数据集的信息,可以输入一个问号?,后面加上函数名。如果想查找某个函数,可以输入两个问号??,后面加上与此函数相关的关键词。函数help及help.search分别等同于?及??。例如:
?median # 等价于help("median"),查看中位数函数的帮助文档
??median # 等价于help.serach("median") 搜索包含median的帮助信息
如果使用的是RStudio,也可以在Help中右上角的搜索框中输入median,查看该函数的帮助文档,如图2-4所示。
默认情况下,help只能查找已经加载到内存中扩展包的函数和数据,如果想查找那些未加载到内存扩展包中的函数和数据,需要指定help函数的package参数中的具体包名或者将try.all.package参数设置为TRUE。例如,想查找shiny包中的runExample函数:
> help("runExample")
No documentation for 'runExample' in specified packages and libraries:
you could try '??runExample'
> help("runExample",package = "shiny")
> help("runExample",try.all.packages = TRUE)
appropos函数能找出所有名字中含有“关键字”的函数,只在载入的包中搜索。例如:
> apropos("plot")
[1] ".__C__recordedplot" "assocplot" "barplot"
[4] "barplot.default" "biplot" "boxplot"
[7] "boxplot.default" "boxplot.matrix" "boxplot.stats"
[10] "cdplot" "coplot" "fourfoldplot"
[13] "interaction.plot" "lag.plot" "matplot"
[16] "monthplot" "mosaicplot" "plot"
[19] "plot.default" "plot.design" "plot.ecdf"
[22] "plot.function" "plot.new" "plot.spec.coherency"
[25] "plot.spec.phase" "plot.stepfun" "plot.ts"
[28] "plot.window" "plot.xy" "preplot"
[31] "qqplot" "recordPlot" "replayPlot"
[34] "savePlot" "screeplot" "spineplot"
[37] "sunflowerplot" "termplot" "ts.plot"
大多数函数都已经有相应的例子帮助我们了解该函数的工作原理。可以通过example函数来查看它们。例如:
> example("median")
median> median(1:4) # = 2.5 [even number]
[1] 2.5
median> median(c(1:3, 100, 1000)) # = 3 [odd, robust]
[1] 3
可以通过data函数查看datasets包中的数据集,如果要查看本地安装包的所有数据集,可以用命令data(package = .packages(all.available = TRUE))查看。
> data()
> data(package = .packages(all.available = TRUE))
3.工作空间
工作空间(workspace)就是当前R的工作环境,它储存所有用户定义的对象(向量、矩阵、函数、数据框、列表、模型、图形等)。例如,通过以下代码创建几个对象。
> # 创建数据对象a,b
> a <- 1:10
> b <- 10:1
> # 创建模型对象fit
> fit <- lm(Sepal.Length~Sepal.Width,data=iris)
> # 创建图形对象q、p
> library(ggplot2)
> q <- qplot(mpg, wt, data = mtcars)
> library(rCharts)
> p <- rPlot(Sepal.Length ~ Sepal.Width | Species, data = iris,
+ type = 'point', color = 'Species')
对象创建完以后,可以通过ls函数查看当前工作空间中的对象。结果如下。
> ls()
[1] "a" "b" "fit" "iris" "p" "q"
如果使用的是RStudio,可以直接在右上角查看当前工作空间的对象,如图2-5所示。
因为对象是储存在内存中的,所以可以删除不需要的对象及时释放内存,提高效率。通过rm()函数移除一个或多个对象,比如想删除对象fit,执行以下命令。
> rm(list="fit")
> ls()
[1] "a" "b" "p" "q"
如果需要删除剩下的全部对象,可以利用list=ls()实现。
> rm(list=ls())
> ls()
character(0)
当前的工作目录(working directory)是R用来读取文件和保存结果的默认目录,可以使用函数getwd()来查看当前的工作目录。
> getwd()
[1] "C:/Users/Think/Documents"
如果想改变当前的工作目录,可以使用setwd()函数或通过“文件”菜单下的“改变工作目录”命令实现。
4.包
包是R函数、数据、预编译代码以一种定义完善的格式组成的集合。R语言的使用,很大程度上是借助各种各样的R包的辅助,从某种程度上讲,R包就是针对R的插件,不同的插件满足不同的需求,截至2016年5月18日,CRAN已经收录了各类包8417个。计算机上存储包的目录称为库(library),该库位于R软件的安装目录/library目录下。可以通过函数.libPaths()查看库所在的位置,通过函数library()可以显示库中已安装的包。
第一次安装一个包,使用命令install.packages("package_name","dir")即可。dir为包安装的路径。默认情况下安装在..library 文件夹中。
例如,要安装一个可以快速读取大数据集的扩展包data.table,只需要执行install.packages( "data.table")即可完成安装。
> install.packages("data.table")
试开URL’
https://mirrors.tuna.tsinghua.edu.cn/CRAN/bin/windows/contrib/3.2/data.table_1.9.6.zip'
Content type 'application/zip' length 1883523 bytes (1.8 MB)
downloaded 1.8 MB
程序包'data.table'打开成功,MD5和检查也通过
下载的二进制程序包在
C:\Users\Think\AppData\Local\Temp\Rtmpoltpbz\downloaded_packages里
也可以选择R的菜单:程序包→安装程序包,在弹出的对话框中,选择要安装的包,然后确定。如果使用的是RStudio,可以选择菜单Tools→Install Packages,调出窗口,包括在线安装和本地安装两种方式。这里我们选择在线安装,只需要在Packages中输入包名后单击Install按钮进行安装即可,如图2-6所示。
包安装后,如果要使用包的功能。必须先把包加载到内存中(默认情况下,R启动后会自动加载基本包),加载包命令:library("包名")或者require("包名")。也可以通过RStudio右下窗口中的Packages加载包。默认情况下,扩展包是未加载到内存中的,如图2-7所示。
直接选中data.table,即可完成包的加载,如图2-8所示。
通过find.package()或者path.package()查看当前环境加载了哪些包。
>find.package() # or path.package()
[1] "C:/Program Files/R/R-3.2.2/library/stringi"
[2] "C:/Program Files/R/R-3.2.2/library/tidyr"
[3] "C:/Program Files/R/R-3.2.2/library/stats"
[4] "C:/Program Files/R/R-3.2.2/library/graphics"
[5] "C:/Program Files/R/R-3.2.2/library/grDevices"
[6] "C:/Program Files/R/R-3.2.2/library/utils"
[7] "C:/Program Files/R/R-3.2.2/library/datasets"
[8] "C:/Program Files/R/R-3.2.2/library/methods"
[9] "C:/PROGRA~1/R/R-32~1.2/library/base"
可以通过detach()函数将已加载的包移出内存。例如,要将ada包从内存中移除,执行detach("package:ada")或取消选中RStudio右下角Packages选项卡中的ada包即可,如图2-9所示。
通过函数remove.packages()将包从本机删除。例如,要从计算机中删除data.table包,需执行以下命令或者单击RStudio右下角Packages选项卡中的data.table包版本号右边的叉,如图2-10所示。
> remove.packages("data.table")
Removing package from 'C:/Program Files/R/R-3.2.2/library'
(as ‘lib’ is unspecified)