简单地说(我们在本书中将一直坚持这个“简单”的风格),R就是一个用于数据的统计处理的软件包,它支持使用一种简单的语言(就是所谓的R语言)来输入各种命令,例如:
>plot(1:10)
请注意,上面的“>”符号,是R的“提示符”,也就是说,所有命令都是在一个“>”符号后面输入的;因此,只有后面的“plot(1:10)”才是你输入的命令,而这个命令的含义就是:
“作一个图,里面包含从1到10共十个点”。
进一步我们可以这样理解:“作图”对应的英文单词就是“plot”,而“1:10”表示从1到10的是个整数。
上面的命令在R计算环境中将会产生如图表1‑1所示的图形。
如果引用维基百科(WikiPedia)的说法:
R语言是一种自由软件编程语言与操作环境,主要用于统计分析、绘图、数据挖掘。R本来是由来自新西兰奥克兰大学的RossIhaka和RobertGentleman开发(也因此称为R),现在由“R开发核心团队”负责开发。R是基于S语言的一个GNU计划项目,所以也可以当作S语言的一种实现。
R内置多种统计学及数字分析功能。R的功能也可以通过安装包(Packages,用户撰写的功能)增强。
等等。
但是对于我们这些仅仅关注工具的使用的“俗人”来说,我们从上面以及其它一些官方的、板着脸的严肃说法中,能够领会出来意思可能只有下面3点:
第一:R是免费的。Wow!
第二:R最强大的用途就是数据处理和绘图。Cool~~
第三:(也是R最为奇妙的特点)R有无数个用途各异的“包(package)”;换句话说,只要你能想到的用途,极有可能在这个地球的某个角落已经有某个家伙把它写成了一个R包;而你所要做的,就是找到这个R包,读读它的帮助文档,就可以着手开始你自己的工作了(find the package, readits help, and begin your own business right away)。
再次提请大家注意上面的第三点:是的,有点不可思议。我们不再需要抱着一本“R语言设计大全”之类的教材,从第一页学到第599,然后才能去开始我们的金融预测或基因分析之类与苦逼程序员八竿子打不着的工作,而是几乎立刻就可以开始自己真正关心的事情了——当然,前提是你很清晰地知道自己的任务。
实际上,现在R上的至少已经有约5000个包,涵盖统计学、生物信息学、数据挖掘、人工智能、财经、生态、化学计量学、药物动力学、地理、高性能计算、基因学等几乎所有设计数值计算的学科,真真正正是“没有R做不到,只有你想不到”。当然,有些包因为是为特定的数据操作编写的,因此可能很快就会谈出R社区而被淘汰,但同时每天又会有新的R包在不断涌现。一些经典领域中的重要而常用的包,一般都有人在维护;关于这些领域的R包的简要介绍,可以在R的“任务视图(TaskViews)”网站找到,网站地址为:
http://cran.r-project.org/web/views/
我们关心的,主要是时间序列相关的分析和计算;该Task View的简介在:
时间序列:http://cran.r-project.org/web/views/TimeSeries.html
当然,我们也可能需要另外两个任务集当中的一些功能,有兴趣的读者可以进一步阅读:
计量经济学:http://cran.r-project.org/web/views/Econometrics.html
金融学:http://cran.r-project.org/web/views/Finance.html
下面我们先看看如何在自己的电脑上安装R的运行环境。
在你的笔记本电脑(当然也可以是你的台式机)上安装R运行环境是一件极为简单的事情。但在安装之前,我们首先要知道,R的运行环境是一套基本上不需要华丽人机界面的程序,因此,为了使用方便,我们还需要为R额外安装一个“外壳”,即图形界面程序,就像我们要用铁锹种庄稼,要在锹把上套一个橡胶套,并戴上手套一样。
因此,我们的安装过程可以由下面2个步骤实现:
(1)下载并安装R(必须的)。
(2)下载并安装RStudio(可选的,用着更顺手)。
首先第一步,安装R:为简单起见,假定你的电脑使用的是Windows操作系统,到R的官方网站:
找到“download R”的链接(http://cran.r-project.org/mirrors.html),你可以看到有一串子可以下载到R的镜像网站的列表(所谓镜像,就是内容一模一样的网站)。选一个和你离得比较近的镜像网站即可。例如,中国用户可以选择位于中国科技大学的镜像网站。
然后点击“Download R for Windows”,可以找到“install R for the first time”链接,这个链接中可以下载R的Windows版本。
需要说明的是,R的Windows版本确实带有一个图形界面(GUI界面),只是这个外壳有点简陋,参见图表1‑2。
在“R Console”窗口的最下面,有一个小小的“>”,就是R的命令提示符,你可以在这个提示符后面键入你要R执行的命令。例如,看看它计算一个简单的正弦值的结果:
> sin(3.14)
[1] 0.001592653
上面显示的结果前面,有一个“[1]”,表示这是输出数据的第1项。这是R的特性之一:R总是将数据看成是一个系列数据的“列表”,哪怕你的结果只有一个数据也是如此。这样的一个列表,被称之为“向量”;向量的概念我们以后将经常遇到。
确认R安装完毕后,我们可以关闭上面的RGui窗口,然后到
下载并安装RStudio的Destop版——这相当于我们前面说的“铁锹上的橡胶套”,用起来比直接使用RGui方便得多。注意:RStudio还有一个Server版,用于通过Web在服务器上执行R计算命令,不过这不在本书讨论范围之内。
RStudio的运行界面如图表1‑3所示。
和RGui类似,RStudio也有一个带“>”提示符的Console窗口,可以直接输入命令。但是它还多了其他一些窗口,例如右面的Environment窗口用于显示当前系统内部的变量和数据,右下的Plots窗口用于绘制图形,Packages窗口展示当前电脑中已经安装了的包,和当前运行的RStudio中已经“调入”了的包。
附注:所谓“调入”,指这个包的程序已经进入了你计算机的内存,随时可以使用了。仅仅安装一个包是不行的,就像一个游戏,仅仅拷贝到你的硬盘上还不能开始玩,只有调入内存后才可以玩。
除了使用Packages窗口调入你要用的包外,还可以使用library命令来调入,例如:
> library("tseries")
调入已经安装过的“tseries”(时间序列分析)包。
安装一个程序包有两种方法:
第一:使用RStudio的Tools菜单的“Install Packages…”命令;该命令弹出如图表1‑4所示的对话框。
在上面对话框中间的空白处,填上要安装的程序包的名称即可。该对话框有一个很好的特性,就是你在键入包名的时候,它可以随时给出提示,以免你键入名称的时候发生拼写错误,或者写错大小写等。
第二种安装程序包的方法是直接使用install.packages()命令。下面给出使用命令行来安装的详细输出结果:
>install.packages("tseries")
trying URL'http://cran.rstudio.com/bin/windows/contrib/3.0/tseries_0.10-32.zip'
Content type'application/zip' length 320827 bytes (313 Kb)
opened URL
downloaded 313 Kb
package ‘tseries’successfully unpacked and MD5 sums checked
The downloaded binarypackages are in
C:UsersAdministratorAppDataLocalTempRtmpMV5n9adownloaded_packages
注意:观察上面的输出信息,我们可以发现,系统将下载到的程序包存储到C盘一个非常隐蔽的临时目录下了。这显然不是太适合我们以后的维护。实际上,我们可以通过
> ?install.packages
来查询?install.packages()命令的使用帮助。系统会自动在Help窗口打开一个帮助页面,显示install.packages()命令的帮助信息。我们可以看到,该命令的使用语法是:
install.packages(pkgs,lib, repos = getOption("repos"),
contriburl = contrib.url(repos,type),
method, available = NULL,destdir = NULL,
dependencies = NA, type =getOption("pkgType"),
configure.args =getOption("configure.args"),
configure.vars =getOption("configure.vars"),
clean = FALSE, Ncpus =getOption("Ncpus", 1L),
verbose =getOption("verbose"),
libs_only = FALSE,INSTALL_opts, quiet = FALSE,
keep_outputs = FALSE, ...)
上面语法中的大部分参数我们可以暂且不管(语法中的…表示还有其它的参数,被省略了;本书沿用这种表示法,在描述输入输出信息的时候,也用…表示被省略的信息),只需要知道,其中的lib参数指定了下载的程序包的存放位置;因此,将我们的安装命令改为:
>install.packages("tseries",lib="D:/Program Files/R/R-3.0.1/library")
即可。注意:D:/Program Files/R/R-3.0.1/是我们的R的安装目录,其中我们使用了“/”作为目录的分割符而不是Windows系统惯用的“”。如果有兴趣你可以看看这个安装目录下的library子目录中都有些什么:一大堆的子目录,每个代表一个R程序包。
安装后的包就可以在RStudio的Packages窗口找到了,并通过勾选包名前面的方框或者使用library()命令调入计算机。
附注:对于有些用户来说,通过RStudio来安装新的R程序包可能不如直接通过RGui来安装,因为后者虽然稍微繁琐些,但是可以选择多种不同的“软件库”,而RStudio目前的版本仅仅支持最常用的CPAN和CPANextra软件库。例如,有大量的生物信息学相关的程序库在BioC软件库中存放,感兴趣的读者可以参阅:
【特别说明:】
本节标题不是夸张的说法;这确实是一个10分钟就可以完成的入门教程。
任何计算机系统,其工作的实质在于,将输入的数据处理后再输出,即:
输入→处理→输出
输入的数据存放在“变量”中。R的变量和其它程序语言的变量的基本思想是一样的,都是使用一个字符型的名称来代表计算机的某块内存,其最基本的将数据存入变量的语法是:
x <- 10
注意上面的“<-”是“赋值”的意思,就是说,讲一个值为10的数值型数据,存放到一个名字叫做“x”的内存变量中。
学过C或Java之类语言的读者可能会问:赋值符不是“=”吗?
嗯,也可以。上面的赋值命令确实也可以写成:
x = 10
执行完上述命令后,在RStudio的“Environment”窗口,可以看到一个名为“x”的变量已经被赋值,其值为10(图表1‑5):
我们前面已经说过,R语言的特点之一,是它普遍性地使用“向量”的概念;所谓向量,通俗地说,就是“一串子数据”的集合。一个只包含一个数据的变量,也可以看成是一个特殊的向量,只是这个向量里面只有一个数据。
R中将向量(变量)的名称输入后直接按回车,相当于要求系统将这个向量的值显示(输出)出来。观察下例:
> x=10
> x
[1] 10
对上面的例子的输出结果我们可以这样理解:
将10存入x后,再将x的内容显示出来,是一个只包含一个数据的向量,该数据的值为10。
学习过《线性代数》课程的读者可能知道代数中“向量”的定义:n个数组成的有序数组,称为n维向量。最简单的例子是中学里面的有方向和大小的“力”的表示,就是一个向量(2维向量)。R语言里面的“向量”的概念与此类似,但更为普遍化:它不仅可以是一系列“数值型”的数据的集合,还可以是任意的其它类型的数据集合。
观察一下下面的例子;其中“1:10”表示要让R为我们生成从1到10的10个整数:
> x=1:10
> x
[1] 1 2 3 4 5 6 7 8 9 10
上面命令的效果,是将一个有10个“元素”的向量,存放到变量“x”中。
再看一个例子:
> z=c("hello","world")
> z
[1] "hello""world"
上面例子中,使用“c”方法(我们以后将混用“方法”、“命令”和“函数”这三个词)将两个单词(字符型数据)放到一个名为“z”的变量中。记住“c”的这个用法,以后会经常遇到。
既然一大堆数据可以放到一个“向量”里面,那么对于这堆数据的处理也可以一次性地完成并放到另一个向量里面;这是R语言的让苦逼数据分析员们欣喜若狂的特性之一:一次输入,干多次的活儿。下面的例子是一次算出10个数的正弦值:
> x=1:10
> z=sin(x)
> z
[1] 0.8414710 0.9092974 0.1411200 -0.7568025 -0.9589243-0.2794155 0.6569866 0.9893582 0.4121185
[10] -0.5440211
R让人欣喜若狂的特性还不止这些。上面不是在z中存储了10个数的正弦值吗?那就把这些值绘成图表示出来:
> plot(x,z)
说明:plot函数用于绘制基本的二维图形,其第一个参数是横坐标值,第二个参数是纵坐标值。因为我们在x和z中已经分别存储了1~10的整数,和这10个整数的正弦值,因此我们直接将这两个变量作为参数送给plot函数即可。
图表1‑6从1到10的10个数的正弦值
嗯~~,上面的图形似乎看不出什么“正弦波”的样子来。不过不要紧,我们还可以修改一下plot函数的绘图方式,看看有什么效果。plot可以设置一个“type”参数,用于指定绘图方式;例如,type="h"指定“直方图”方式,表示线条方式,而表示同时显示线条和点。
我们试试绘图方式“b”:
>plot(x,z,type="b")
结果为:
图表1‑7同时带有数据点和连线的正弦曲线图
当然,上图仍然很不完美:由于绘图的采样点比较少(只有10个),所以做出来的曲线很不平滑。不过,我们将上面的作图指令稍作更改,即可添加更多的作图点:
> x=1:100
> xx=x/10
> xx
[1] 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
[11] 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0
[21] 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0
[31] 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.0
[41] 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5.0
[51] 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 6.0
[61] 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 7.0
[71] 7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9 8.0
[81] 8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8 8.9 9.0
[91] 9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9 10.0
> plot(xx,sin(xx))
上面我们不嫌麻烦地将变量xx的所有取值都显示出来,只是为了让您更好地理解这里是如何在0~10的范围内,生成了100个采样点:首先,我们生成1:100共100个整数,然后将这些数统统除以10,得到0~10内的100个点,并将这些点赋值到变量xx中。然后,使用plot函数绘制以xx为横坐标,以sin(xx)为纵坐标的图形。输出结果为:
图表1‑8有100个绘图点的正弦曲线
修改一下作图参数,我们可以得到更有特色的图形;例如,plot函数支持“col”参数,用于指定作图的颜色。我们使用下面指令:
>plot(xx,sin(xx),col="red",type="h")
来绘制红色直方图形式的正弦波:
图表1‑9红色直方图形式的正弦波
在结束我们的闪电入门之前,思考一下这样的问题:
上面的绘图是在横坐标为0~10的范围上进行的。如果我们要在0~2π之间绘制正弦波的图形,仍然要取100个绘图点,该如何做呢?
提示:
如果x仍是在1~100之间,那么x/100*3.14159*2的取值范围是多少呢?
将多个R函数(命令、方法等)保存到一个文本文件中,就可以称之为一个R程序。按照习惯,这样的文本文件一般使用“.R”作为其文件名后缀。
现在,假设我们想方便地做出不同形式的正弦图,可以将作图的指令写到一个R文件中。我们就把这个文件叫做hello.R吧:
#Hello.R
drawsine <-function(type) {
x=1:100
x=x/10
y=sin(x)
plot(x, y, type)
}
我们可以使用RStudio的“File -- New File -- RScript”菜单命令来新建一个R文件(称之为“R脚本文件”,RScript);脚本文件的内容如上所示。RStudio会打开一个Script窗口来让你编辑文件的内容,如下面图表1‑10所示。
我们可以观察到,在这个脚本编辑窗口的顶部,出了一半的“保存(Save)”等按钮图标外,还有一个“SourceonSave”选择框,它的意思是:当你“Save”脚本的时候(也就是说,当你编写完成的时候),自动对当前文件执行一个“source”命令。Source命令的作用是读入该文件并执行之。这是一个很好用的特性,因为一般来说,我们倾向于将文件保存到一个很“深”的子目录中,直接使用source命令来读入该文件往往写起来很罗嗦,例如,你可能需要写:
source('C:/MyDocument/paper/book/data/Hello.R')
才能读入该文件,现在只需要点击一下“保存”按钮即可。
我们现在来分析一下这个脚本文件的内容。
首先,在第一行,以“#”开头的文本是注释,它对于脚本程序的运行没有任何影响,目前可以完全被我们忽略掉——当然,在脚本里面使用注释说明你的程序的编写思路、算法等等,是一个非常良好的习惯,但现在我们可以先不用管它,毕竟现在的程序太“小”了,不写注释地球人也看得懂。
然后是第二行:
drawsine <-function(type){…}
这一行的意思是:定义一个名字为“drawsine”的函数(function),它只有一个参数type,函数具体要执行的所有命令都在一对大括号“{ }”的中间写出。
该文件的其余内容就是所谓的函数体了,即函数具体要做的事情。写法很简单:每行一个命令(或其它函数)。在我们的例子中,共有4行内容,最后一行调用了plot函数,并引用了drawsine函数的参数type。
因为我们勾选了“Source on Save”,在文件存盘的时候该脚本已经自动调入内存,因此我们可以直接调用其中的函数,看看有什么情况发生:
>drawsine(type="l")
>drawsine(type="o")
>drawsine("b")
>drawsine("h")
可以观察到,当使用不同的参数调用drawsine时,系统会绘制出来不同风格的图形。另外还请注意,在调用参数的时候,如果没有歧义,可以省略参数的名称,即为type参数传递值的“type="o"”,可以简单的写为“"o"”。
还记得本节的标题吗?5分钟写两个R程序,也不是夸张的说法,因为第二个程序非常容易:直接将第一个程序复制一遍,修改一下文件名,并增加一个“col”参数即可:
图表1‑11第二个R脚本:drawsine2()接受2个参数
观察一下里面的drawsine2()函数,它接受两个参数,一个绘图类型type,另一个是颜色col;仔细看看,里面有一处值得注意的地方:
在调用plot函数的时候,它使用参数的方式为:
type=type, col=col
这里面,“type=type”的表达可能会引起疑虑——实际上,坦白地说,这是我的一个懒惰的习惯:我总习惯于将自己定义的函数的参数名称,写成和要调用的R内部函数的参数名称一样;这样,当传递参数的时候,我可以简单地写成上面的形式,而不需要记忆复杂的参数名称。
“type=type”的实际含义是:
第一个type是plot()需要的参数的名称,第二个type是我调用drawdine2()函数的时候传递给drawsine2()的type参数的值。
在调用的时候,最好也说明白。例如:
> drawsine2(type="l",col=”red")
> drawsine2(col="red",type="o")
从上面的例子也可以看出,传递参数的时候指明参数的名称是个好习惯,因为除非你的函数只有一个参数,否则的话可能会因为参数顺序的不同而引起混乱。只要能坚持在调用函数的时候写上参数的名称,那么我的懒惰习惯也还算是一个比较有效率的好习惯。
下章我们开始接触时间序列数据。在这之前,再介绍一个小秘密——
有些读者对于不断地要“安装”这个包、“加载”那个包心生疑虑:在R语言的大生态环境里面,到底有哪些软件包,以及某个特定的领域是否有相关的软件包支持?我怎么快速找到所有这些问题的答案?
如果你的心中曾经有过这样的疑虑,建议你安装一个“sos”包,这个包专门用来快速搜索相关的软件包和函数的帮助文档;它的findFn()函数可以访问Jonathan Baron的R Site Search数据库,并将返回结果使用规范而漂亮的HTML页面表现出来——这可比R Site Search的那种类似Google搜索引擎的那种结果显示形式好多了。
作为一个简单的例子,我们试试搜一下forecast相关的文献:
> install.packages("sos")
> library("sos")
>RSiteSearch("forecast")
檢索查詢疑問已被提交给http://search.r-project.org
计算结果应很快就在瀏覽器里打开
>findFn("forecast")
found 808matches; retrieving 20 pages, 400matches.
2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 1718 19 20
Downloaded 369 linksin 61 packages.
然后浏览器会弹出一个网页,显示搜索结果:
图表1‑12对主题为“forecast”的搜索结果(部分截图)
估计当你面对这样一张详尽而美丽的搜索结果图表时,所有的疑虑肯定会一扫而空,对未来的工作则充满了自信和期待,(正如作者之一当时第一次使用findFn()的时候一样——真是那个爽啊!图样图森破,哈哈。。。)
Okay,言归正传。
转载本文请联系原作者获取授权,同时请注明本文来自王乐科学网博客。
链接地址:https://wap.sciencenet.cn/blog-577790-829958.html?mobile=1
收藏