前言
R是一种用于数据处理和统计分析的脚本语言,它受到由AT&T实验室开发的统计语言S的启发,且基本上兼容于S语言。S语言的名称代表统计学(statistics),用来纪念AT&T开发的另一门以一个字母命名的编程语言,这就是著名的C语言。后来一家小公司买下了S,给它添加了图形用户界面并命名为S-Plus。
由于R是免费的,而且有更多的人贡献自己的代码,R语言变得比S和S-Plus更受欢迎。R有时亦称为GNU S,以反映它的开源属性。(GNU项目是开源软件的一个重要集合。)
为什么在统计工作中用R
粤语有个词“又便又靓”,意思是“物美价廉”,R语言就是这样一种工具,为什么还要用别的呢?
R语言有许多优点:
它是广受关注的统计语言S在公众领域的实现,而且R/S已经是专业统计学家的实际标准语言。
在绝大多数情况下,它的功能不亚于甚至优于商业软件,比如它有大量的函数、良好的可编程性、强大的绘图功能,等等。
在Windows、Mac、Linux等操作系统上都有相应的版本。
除了提供统计操作以外,R还是门通用编程语言,所以你可以用它做自动分析、创建新的函数来拓展语言的现有功能。
它结合了面向对象语言和函数式编程语言的特性。
系统在两次会话之间可以保存数据集,所以不需要每次重新加载数据集。R还可以保存历史命令。
因为R是开源软件,所以很容易从用户社区获得帮助。另外,用户们贡献了大量的新函数,其中很多用户都是杰出的统计学家。
我必须事先提醒你,最好直接在终端窗口输入命令并提交给R,而不是在GUI里用鼠标点击菜单,并且大多数R用户都不用GUI。这并不是说R不能图形化操作。相反,它有很多工具可以生成实用、美观的图形,不过这些工具是用在系统输出方面,比如画图,而不是用在输入方面。
如果你离不开GUI,则可以选用一种免费的GUI,它们是为R开发的,比如下面几种开源的或免费的工具:
RStudio,
StatET,
ESS (Emacs Speaks Statistics),
R Commander:John Fox,“The R Commander: A Basic-Statistics Graphical Interface to R,” Journal of Statistical Software 14, no. 9 (2005):1–42.
JGR (Java GUI for R),
前三种软件,RStudio、StatET和 ESS属于集成开发环境(Integrated Development Environments, IDE),更多地是为编程设计的。StatET和ESS则为R程序员分别提供了针对著名的Eclipse 和Emacs环境的IDE。
在商业软件中,另一种IDE出自Revolution Analytics公司,一家提供R语言服务的公司。
因为R是一种编程语言而不是各种不相关联的命令汇总,你可以把几个命令组合起来使用,每条命令用前一条命令的输出作为输入。(Linux用户可能会认出:这类似于用管道将shell命令串联起来。)这种组合R函数的能力带来了巨大的灵活性,如果使用恰当,功能会非常强大。
下面是个简单的例子,请看这条命令:
nrow(subset(x03,z == 1))
首先,subset()函数针对数据框x03提取出变量z(取值为1)的所有记录,得到一个新的数据框,再把这个新数据框代入nrow()函数。这个函数计算数据框的行数。这行命令的最终效果是给出原数据框中z=1的记录的个数。
之前提到过面向对象编程和函数式编程这两个术语。这两个主题会激起计算机科学家的兴趣,尽管它们对大多数读者来说可能有点陌生,但是它们跟任何使用R做统计编程的人都有关。下面概述这两个主题。
面向对象编程
面向对象的优点可以用例子来解释,例如回归模型。当你用SAS、SPSS等其他统计软件做回归分析时,你会在屏幕上看到一大堆的输出结果。与之相反,如果在R里调用回归函数lm(),函数会返回一个包含所有结果的对象,对象里含有回归系数的估计、估计值的标准差、残差等。接下来你可以用编程的方式挑选对象里需要的部分并提取出来。
你会看到通过R的方式可使编程变得更容易,部分因为它提供了访问数据的一致性。这种一致性源于R是多态的,即一个函数可以应用于不同类型的输入,函数在运行过程中会选择适当的方式来处理。这样的函数称为泛型函数。(如果你是C++程序员,肯定见过类似的概念虚函数。)
例如plot()函数,如果你把它应用到一列数上,会得到一幅简单的图。但是如果把它应用到某个回归分析的输出结果中,会得到关于回归分析多个方面的一整套图形。当然,你只能在R生成的对象上使用plot()函数。这样也好,这意味着用户需要记的命令更少了!
函数式编程
避免显式迭代是R语言的一个常见话题,这对于函数式编程语言来说是很典型的问题。你可以利用R的函数特性把迭代行为表达成隐式的,而不是用循环语句。这可以让代码执行起来更有效率,当R运行在大数据集上时运行时间会相差很大。
正如你看到的,R语言函数式编程的属性有许多优点:
更清晰,更紧凑的代码。
有潜力达到更快的执行速度。
减少了调试的工作量,因为代码更简单。
容易转化为并行编程。
目录
第1章 1.0 快速入门
1.1 怎样运行R
1.2 第一个R会话
1.3 函数入门
1.4 R语言中一些重要的数据结构
1.5 扩展案例:考试成绩的回归分析
1.6 启动和关闭R
1.7 获取帮助
第2章 2.0 向量
2.1 标量、向量、数组与矩阵
2.2 声明
2.3 循环补齐
2.4 常用的向量运算
2.5 使用all()和any()
2.6 向量化运算符
2.7 NA与NULL值
2.8 筛选
2.9 向量化的ifelse()函数
2.10 测试向量相等
2.11 向量元素的名称
2.12 关于c()的更多内容
第3章 3.0 矩阵和数组
3.1 创建矩阵
3.2 一般矩阵运算
3.3 对矩阵的行和列调用函数
3.4 增加或删除矩阵的行或列
3.5 向量与矩阵的差异
3.6 避免意外降维
3.7 矩阵的行和列的命名问题
3.8 高维数组