欢迎光临
免费的PDF电子书下载网站

R语言编程艺术(著名计算机科学家兼统计学家撰写,Amazon五星级畅销书,R语言领域公认经典著作) PDF下载

编辑推荐

  R是一种用于统计计算与做图的开源软件,同时也是一种编程语言,它广泛应用于企业和学术界的数据分析领域,正在成为*通用的语言之一。由于近几年数据挖掘、大数据等概念的走红,R也越来越多地被人关注。截至本文完成之日,CRAN(http://cran.r-project.org/)上共有4383个包,涉及统计、化学、经济、生物、医学、心理、社会学等各个学科。不同类型的公司,比如Google、辉瑞、默克、美国银行、洲际酒店集团和壳牌公司都在使用它,同时以S语言环境为基础的R语言由于其鲜明的特色,一出现就受到了统计专业人士的青睐,成为国外大学里相当标准的统计软件。
  一直以来,国内外关于R语言的著作都是以统计学专业的视角来介绍R语言的,对R语言本身的特性讲解得并不详尽,而软件自带的官方文档又显得过于技术,不那么亲民。另一方面,很多接触R的朋友都来自非计算机专业,没有接受过编程训练,他们使用R的时候,编写出来的代码通常只能算是一条条命令的集合,面对更复杂的问题,常常束手无策。记得在某届R语言大会上,有位SAS阵营的朋友说,他看到演讲者所展示的代码里只有函数调用,没有编程的东西,所以他觉得R不能算一种编程语言。其实,他错了,此时你手里这本书,覆盖了其他大部分R语言图书没有涉及的编程主题。这本书就如同R语言的九阳神功秘籍,当神功练成,任督二脉一旦打通,再学习针对某一领域应用的函数或包就如庖丁解牛一般。顺便提一下,据微博上的小道消息,前面提到的那位朋友*近也开始学R了。
  本书的特点表现在以下几个方面:
  **,对读者的统计学知识和编程水平要求并不高。与很多R语言书籍不同,这本书并不需要很深的统计学功底,它从纯语言的角度入手来讲解R。对于有一定编程经验却没什么统计学背景的人来说,读这本书会比较顺畅,读者就可以重点关注R语言的特性在数据分析方面的应用。在有的地方,作者也会提醒那些有其他语言编程经验的人应该注意R语言有什么不同之处。而对于没有编程经验又想使用R做数据分析的人来说,这本书也是学习编程的绝佳教材。
  第二,专注于R语言编程。作者没有把这本书定位为菜谱式的手册,也不像有些R语言图书那样介绍完统计学某方面应用之后简单地把R语言代码摆出来。翻开这本书的目录,你几乎看不到统计学的术语。本书系统介绍了R语言的各种数据结构和编程结构、面向对象编程方法、socket网络编程、并行计算、代码调试、程序性能提升以及R语言与其他语言的接口等主题。书中也提到了不少编程的小技巧,这都是作者多年编程经验的总结。
  第三,丰富的案例分析。作者Matloff教授是位计算机科学家,同时也是位统计学家,有多年的教学经验,也做过统计学方法论的顾问。除了正文中的例子之外,本书还有44个扩展案例,很多案例源自作者亲身参与过的咨询项目。虽然本书没有讲解任何统计模型,但是扩展案例都是和数据分析相关的,比如对鲍鱼数据的重新编码(第2章)、寻找异常值(第3章)、文本词汇索引(第4章)、学习中文方言的辅助工具(第5章)等。通过学习这些案例,读者不仅能学到R语言的每种概念如何运作,也会学到如何把这些概念组合到一起成为有用的程序。比如第10章介绍了socket网络编程之后,就用一个扩展案例讲解如何用socket实现并行计算,这为第16章详细讲解并行计算做好了铺垫。在很多案例里,作者讨论了好几种设计方案,并比较了这几种方案的不同之处,以回答“为什么这样做”,这对于缺少编程经验的人来说,是非常好的安排。
  本书第1章简要介绍了R语言的几种数据结构和编程基础,其余章节可分为三大部分。
  **部分(第2~6章)详细介绍R的几种主要的数据结构:向量、矩阵、列表、数据框和因子等。对很多人来说,R复杂多变的数据结构真的是一只拦路虎。而本书从*简单的向量开始,一步一步引导读者认识并掌握各种数据结构。
  第二部分(第7~13章)涉及编程方面:编程结构和面向对象特性、输入/输出、字符串处理以及绘图。值得一提的是第13章,这章主要讲解的是R语言的调试。很多朋友在实际工作中有这样的经历,你可能用了一个小时就写好代码,却用了一天的时间来调试。可是到目前为止还没有在其他图书上看到与R语言调试相关的内容,甚至也很少见到关于其他编程语言调试的图书。本书刚好填补了这方面的空白。如果读者仔细读完第13章,并实践其中的调试技巧,一定能事半功倍,也就能少熬点儿夜,有延长寿命的功效。本书的作者同时也著有《调试的艺术》(TheArt of Debugging),相信他在R语言调试方面的功力也是相当深厚的。
  第三部分(第14~16章)介绍的是更高级的内容,比如执行速度和性能的提升(第14章)、R语言与C/C++或Python混合编程(第15章)以及R语言并行计算(第16章),虽然*后一部分属于编程的高级内容,但如果读者从前往后一直学下来,随着能力的提高,也是可以读懂的。
  本人从2007年开始接触R语言,那时候市面上几乎没有R语言方面的书籍。当时我关于R语言的所有信息几乎都是来自统计之都(http://cos.name)和谢益辉的博客(http://yihui.name)。2008年冬天,统计之都成功举办了“**届中国R语言会议”,来自各地的R语言用户们齐聚一堂,交流心得。从那以后,每年的R语言会议都会在北京和上海举办。这几年来,统计之都的队伍也逐渐壮大,比如本书的其他三位主要译者:邱怡轩、潘岚锋和熊熹,当年他们参加R语言会议的时候还是人大统计学院大一、大二的学生,后来也成为R语言社区的领军人物。去年我们接到本书的翻译任务时,他们三人分别收到了美国普度大学、爱荷华州立大学以及明尼苏达大学的录取通知,现在已经在美国留学深造。希望有越来越多的人加入统计之都的大家庭,和大家一起成长,为中国统计事业的发展尽自己的一份力。
  在翻译过程中,几位译者力求忠实于原文,但纠正了原书的几处错误,同时也兼顾中文表达的流畅,不过译文中可能仍有不当之处,欢迎读者予以指正。
  除了本人以及前面提到的三位译者之外,统计之都的三位老朋友林宇、严紫丹和程豪也参与了本书部分章节的校审和初稿翻译,在此表示感谢。全书译文*后由本人统稿,如有错误之处,均由本人承担。
  也感谢机械工业出版社的吴怡编辑,她给予了我们细心的帮助。
  统计之都的图书出版栏目(网址是http://cos.name/books/)有本书的页面,读者可以在这里下载本书的数据和代码,也可以留言提问。

 ;

内容简介

暂无

作者简介

  本书三位主要译者都是统计之都(http://cos.name)的管理员、中国R语言会议理事会成员。
  陈堰平毕业于中国人民大学统计学院,现任国家金融信息中心数据中心研发部负责人,从事指数编制、指数化投资、金融衍生品方面的工作,对金融数据分析有多年的研究,博客网址为http://yanping.me。邱怡轩是普度大学统计系在读博士研究生,开发过rarpark、R2SWF、Layer等R语言程序包,博客网址为http://yixuan.cos.name/。潘岚峰是爱荷华州立大学统计系在读博士研究生,开发过R语言程序包bignmf。
  陈堰平
  2013年3月于新华通讯社第三工作区

R语言编程艺术(著名计算机科学家兼统计学家撰写,Amazon五星级畅销书,R语言领域公认经典著作) PDF下载

目录


 
译者序
前 言
致 谢
第1章 快速入门
1.1 怎样运行R
1.1.1 交互模式
1.1.2 批处理模式
1.2 第一个R会话
1.3 函数入门
1.3.1 变量的作用域
1.3.2 默认参数
1.4 R语言中一些重要的数据结构
1.4.1 向量,R语言中的战斗机
1.4.2 字符串
1.4.3 矩阵
1.4.4 列表
1.4.5 数据框
1.4.6 类
1.5 扩展案例:考试成绩的回归分析
1.6 启动和关闭R
1.7 获取帮助
1.7.1 help()函数
1.7.2 example()函数
1.7.3 如果你不太清楚要查找什么
1.7.4 其他主题的帮助
1.7.5 批处理模式的帮助
1.7.6 互联网资源
第2章 向量
2.1 标量、向量、数组与矩阵
2.1.1 添加或删除向量元素
2.1.2 获取向量长度
2.1.3 作为向量的矩阵和数组
2.2 声明
2.3 循环补齐
2.4 常用的向量运算
2.4.1 向量运算和逻辑运算
2.4.2 向量索引
2.4.3 用:运算符创建向量
2.4.4 使用seq()创建向量
2.4.5 使用rep()重复向量常数
2.5 使用all()和any()
2.5.1 扩展案例:寻找连续出现1的游程
2.5.2 扩展案例:预测离散值时间序列
2.6 向量化运算符
2.6.1 向量输入,向量输出
2.6.2 向量输入,矩阵输出
2.7 NA与NULL值
2.7.1 NA的使用
2.7.2 NULL的使用
2.8 筛选
2.8.1 生成筛选索引
2.8.2 使用subset()函数筛选
2.8.3 选择函数which()
2.9 向量化的ifelse()函数
2.9.1 扩展案例:度量相关性
2.9.2 扩展案例:对鲍鱼数据集重新编码
2.10 测试向量相等
2.11 向量元素的名称
2.12 关于c()的更多内容
第3章 矩阵和数组
3.1 创建矩阵
3.2 一般矩阵运算
3.2.1 线性代数运算
3.2.2 矩阵索引
3.2.3 扩展案例:图像操作
3.2.4 矩阵元素筛选
3.2.5 扩展案例:生成协方差矩阵
3.3 对矩阵的行和列调用函数
3.3.1 使用apply()函数
3.3.2 扩展案例:寻找异常值
3.4 增加或删除矩阵的行或列
3.4.1 改变矩阵的大小
3.4.2 扩展案例:找到图中距离最近的一对端点
3.5 向量与矩阵的差异
3.6 避免意外降维
3.7 矩阵的行和列的命名问题
3.8 高维数组
第4章 列表
4.1 创建列表
4.2 列表的常规操作
4.2.1 列表索引
4.2.2 增加或删除列表元素
4.2.3 获取列表长度
4.2.4 扩展案例:文本词汇索引
4.3 访问列表元素和值
4.4 在列表上使用apply系列函数
4.4.1 lapply()和sapply()的使用
4.4.2 扩展案例:文本词汇索引(续)
4.4.3 扩展案例:鲍鱼数据
4.5 递归型列表
第5章 数据框
5.1 创建数据框
5.1.1 访问数据框
5.1.2 扩展案例:考试成绩的回归分析(续)
5.2 其他矩阵式操作
5.2.1 提取子数据框
5.2.2 缺失值的处理
5.2.3 使用rbind()和cbind()等函数
5.2.4 使用apply()
5.2.5 扩展案例:工资研究
5.3 合并数据框
5.4 应用于数据框的函数
5.4.1 在数据框上应用lapply()和sapply()函数
5.4.2 扩展案例:应用Logistic模型
5.4.3 扩展案例:学习中文方言的辅助工具
第6章 因子和表
6.1 因子与水平
6.2 因子的常用函数
6.2.1 tapply函数
6.2.2 split()函数
6.2.3 by()函数
6.3 表的操作
6.3.1 表中有关矩阵和类似数组的操作
6.3.2 扩展案例: 提取子表
6.3.3 扩展案例:在表中寻找频数最大的单元格
6.4 其他与因子和表有关的函数
6.4.1 aggregate()函数
6.4.2 cut()函数
第7章 R语言编程结构
7.1 控制语句
7.1.1 循环
7.1.2 对非向量集合的循环
7.1.3 if-else结构
7.2 算术和逻辑运算符及数值
7.3 参数的默认值
7.4 返回值
7.4.1 决定是否显式调用return ()
7.4.2 返回复杂对象
7.5 函数都是对象
7.6 环境和变量作用域的问题
7.6.1 顶层环境
7.6.2 变量作用域的层次
7.6.3 关于ls()的进一步讨论
7.6.4 函数(几乎)没有副作用
7.6.5 扩展案例:显示调用框的函数
7.7 R语言中没有指针
7.8 向上级层次进行写操作
7.8.1 利用超赋值运算符对非局部变量进行写操作
7.8.2 用assign()函数对非局部变量进行写操作
7.8.3 扩展案例:用R语言实现离散事件仿真
7.8.4 什么时候使用全局变量
7.8.5 闭包
7.9 递归
7.9.1 Quicksort的具体实现
7.9.2 拓展举例:二叉查找树
7.10 置换函数
7.10.1 什么是置换函数
7.10.2 扩展案例:可记录元素修改次数的向量类
7.11 写函数代码的工具
7.11.1 文本编辑器和集成开发环境
7.11.2 edit()函数
7.12 创建自己的二元运算符
7.13 匿名函数
第8章 数学运算与模拟
8.1 数学函数
8.1.1 扩展例子:计算概率
8.1.2 累积和与累积乘积
8.1.3 最小值和最大值
8.1.4 微积分
8.2 统计分布函数
8.3 排序
8.4 向量和矩阵的线性代数运算
8.4.1 扩展示例:向量叉积
8.4.2 扩展示例:确定马尔科夫链的平稳分布
8.5 集合运算
8.6 用R做模拟
8.6.1 内置的随机变量发生器
8.6.2 重复运行时获得相同的随机数流
8.6.3 扩展案例:组合的模拟
第9章 面向对象的编程
9.1 S3类
9.1.1 S3泛型函数
9.1.2 实例:线性模型函数lm()中的OOP
9.1.3 寻找泛型函数的实现方法
9.1.4 编写S3类
9.1.5 使用继承
9.1.6 扩展示例:用于存储上三角矩阵的类
9.1.7 扩展示例:多项式回归程序
9.2 S4类
9.2.1 编写S4类
9.2.2 在S4类上实现泛型函数
9.3 S3类和S4类的对比
9.4 对象的管理
9.4.1 用ls()函数列出所有对象
9.4.2 用rm()函数删除特定对象
9.4.3 用save()函数保存对象集合
9.4.4 查看对象内部结构
9.4.5 exists()函数
第10章 输入与输出
10.1 连接键盘与显示器
10.1.1 使用scan()函数
10.1.2 使用readline()函数
10.1.3 输出到显示器
10.2 读写文件
10.2.1 从文件中读取数据框或矩阵
10.2.2 读取文本文件
10.2.3 连接的介绍
10.2.4 扩展案例:读取PUMS普查数据
10.2.5 通过URL在远程计算机上访问文件
10.2.6 写文件
10.2.7 获取文件和目录信息
10.2.8 扩展案例:多个文件内容的和
10.3 访问互联网
10.3.1 TCP/IP概述
10.3.2 R中的socket
10.3.3 扩展案例:实现R的并行计算
第11章 字符串操作
11.1 字符串操作函数概述
11.1.1 grep()
11.1.2 nchar()
11.1.3 paste()
11.1.4 sprintf()
11.1.5 substr()
11.1.6 strsplit()
11.1.7 regexpr()
11.1.8 gregexpr()
11.2 正则表达式
11.2.1 扩展案例:检测文件名的后缀
11.2.2 扩展案例:生成文件名
11.3 在调试工具edtdbg中使用字符串工具
第12章 绘图
12.1 创建图形
12.1.1 基础图形系统的核心:plot()函数
12.1.2 添加线条:abline()函数
12.1.3 在保持现有图形的基础上新增一个绘图窗口
12.1.4 扩展案例:在一张图中绘制两条密度曲线
12.1.5 扩展案例:进一步考察多项式回归
12.1.6 添加点:points()函数
12.1.7 添加图例:legend()函数
12.1.8 添加文字:text()函数
12.1.9 精确定位:locator()函数
12.1.10 保存图形
12.2 定制图形
12.2.1 改变字符大小:cex选项
12.2.2 改变坐标轴的范围:xlim和ylim选项
12.2.3 添加多边形:polygon()函数
12.2.4 平滑散点:lowess()和loess()函数
12.2.5 绘制具有显式表达式的函数
12.2.6 扩展案例:放大曲线的一部分
12.3 将图形保存到文件
12.3.1 R图形设备
12.3.2 保存已显示的图形
12.3.3 关闭R图形设备
12.4 创建三维图形
第13章 调试
13.1 调试的基本原则
13.1.1 调试的本质:确认原则
13.1.2 从小处着手
13.1.3 模块化的、自顶向下的调试风格
13.1.4 反漏洞
13.2 为什么要使用调试工具
13.3 使用R的调试工具
13.3.1 利用debug()和browser()函数进行逐步调试
13.3.2 使用浏览器命令
13.3.3 设置断点
13.3.4 使用trace()函数进行追踪
13.3.5 使用traceback()和debugger()函数对崩溃的程序进行检查
13.3.6 扩展案例:两个完整的调试会话
13.4 更方便的调试工具
13.5 在调试模拟数据的代码时请确保一致性
13.6 语法和运行时错误
13.7 在R上运行GDB
第14章 性能提升:速度和内存
14.1 编写快速的R代码
14.2 可怕的for循环
14.2.1 用向量化提升速度
14.2.2 扩展案例:在蒙特卡罗模拟中获得更快的速度
14.2.3 扩展案例:生成幂次矩阵
14.3 函数式编程和内存问题
14.3.1 向量赋值问题
14.3.2 改变时拷贝
14.3.3 扩展案例:避免内存拷贝
14.4 利用Rprof()来寻找代码的瓶颈
14.4.1 利用Rprof()来进行监视
14.4.2 Rprof()的工作原理
14.5 字节码编译
14.6 内存无法装下数据怎么办
14.6.1 分块
14.6.2 利用R软件包来进行内存管理
第15章 R与其他语言的接口
15.1 编写能被R调用的C/C++函数
15.1.1 R与C/C++交互的预备知识
15.1.2 例子:提取方阵的次对角线元素
15.1.3 编译和运行程序
15.1.4 调试R/C程序
15.1.5 扩展案例:预测离散取值的时间序列
15.2 从Python调用R
15.2.1 安装RPy
15.2.2 RPy语法
第16章 R语言并行计算
16.1 共同外链问题
16.2 snow包简介
16.2.1 运行snow代码
16.2.2 分析snow代码
16.2.3 可以获得多少倍的加速
16.2.4 扩展案例:K均值聚类
16.3 借助于C
16.3.1 利用多核机器
16.3.2 扩展案例:利用OpenMP解决共同外链问题
16.3.3 运行OpenMP代码
16.3.4 OpenMP代码分析
16.3.5 其他OpenMP指令
16.3.6 GPU编程
16.4 普遍的性能考虑
16.4.1 开销的来源
16.4.2 简单并行程序,以及那些不简单的
16.4.3 静态和动态任务分配
16.4.4 软件炼金术:将一般的问题转化为简单并行问题
16.5 调试R语言并行计算的代码
附录A 安装R
附录B 安装和使用包

前沿

 ;R是一种用于数据处理和统计分析的脚本语言,它受到由AT&;T实验室开发的统计语言S的启发,且基本上兼容于S语言。S语言的名称代表统计学(statistics),用来纪念AT&;T开发的另一门以一个字母命名的编程语言,这就是著名的C语言。后来一家小公司买下了S,给它添加了图形用户界面并命名为S-Plus。
 ; ; ;由于R是免费的,而且有更多的人贡献自己的代码,R语言变得比S和S-Plus更受欢迎。R有时亦称为GNUS,以反映它的开源属性。(GNU项目是开源软件的一个重要集合。)
为什么在统计工作中用R
 ; ; ;粤语有个词“又便又靓”,意思是“物美价廉”,R语言就是这样一种工具,为什么还要用别的呢?
 ; ; ; R语言有许多优点:
 ; ; ;它是广受关注的统计语言S在公众领域的实现,而且R/S已经是专业统计学家的实际标准语言。
 ; ; ;在绝大多数情况下,它的功能不亚于甚至优于商业软件,比如它有大量的函数、良好的可编程性、强大的绘图功能,等等。
 ; ; ; 在Windows、Mac、Linux等操作系统上都有相应的版本。
 ; ; ;除了提供统计操作以外,R还是门通用编程语言,所以你可以用它做自动分析、创建新的函数来拓展语言的现有功能。
 ; ; ; 它结合了面向对象语言和函数式编程语言的特性。
 ; ; ;系统在两次会话之间可以保存数据集,所以不需要每次重新加载数据集。R还可以保存历史命令。
 ; ; ;因为R是开源软件,所以很容易从用户社区获得帮助。另外,用户们贡献了大量的新函数,其中很多用户都是杰出的统计学家。
 ; ; ;我必须事先提醒你,最好直接在终端窗口输入命令并提交给R,而不是在GUI里用鼠标点击菜单,并且大多数R用户都不用GUI。这并不是说R不能图形化操作。相反,它有很多工具可以生成实用、美观的图形,不过这些工具是用在系统输出方面,比如画图,而不是用在输入方面。
 ; ; ;如果你离不开GUI,则可以选用一种免费的GUI,它们是为R开发的,比如下面几种开源的或免费的工具:
 ; ; ; RStudio,http://www.rstudio.org/
 ; ; ; StatET,http://www.walware.de/goto/statet/
 ; ; ; ESS (Emacs SpeaksStatistics),http://ess.r-project.org/
 ; ; ; R Commander:John Fox,“The R Commander: ABasic-Statistics Graphical Interface to R,” Journalof ; ; ; ; Statistical Software 14, no. 9(2005):1–42.
 ; ; ; JGR (Java GUI forR),http://cran.r-project.org/web/packages/JGR/index.html
 ; ; ; 前三种软件,RStudio、StatET和 ESS属于集成开发环境(IntegratedDevelopment Environments,IDE),更多地是为编程设计的。StatET和ESS则为R程序员分别提供了针对著名的Eclipse和Emacs环境的IDE。
 ; ; ; 在商业软件中,另一种IDE出自RevolutionAnalytics公司,一家提供R语言服务的公司(http://www.revolutionanalytics.com/)。
 ; ; ;因为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语言函数式编程的属性有许多优点:
 ; ; ; 更清晰,更紧凑的代码。
 ; ;  有潜力达到更快的执行速度。
    减少了调试的工作量,因为代码更简单。
    容易转化为并行编程。
本书的读者对象
   许多人以特定的方式使用R——直方图、回归分析或者其他涉及统计运算的任务。不过本书针对的是那些希望用R开发软件的读者。本书的目标读者从专业软件开发人员,到只在大学修过编程课、为了完成特定任务而写R代码的人。(统计学知识一般不是必需的。)
    以下几类人可能会从本书受益:
    受雇于某个需要定期制作统计报告的机构,比如医院、政府机关等,为此需要开发专用程序。
   开发统计学方法论的学术研究人员,所研究的方法论要么是全新的,要么就是结合了现有的方法并将其整合到一起,这些需要编程来实现,让学术界里更多的人能够使用。
   在市场营销、诉讼支持、新闻、出版等领域工作,需要通过编码来制作复杂图形以实现数据可视化的专家。
    有软件开发经验,参与的项目涉及统计分析的专业程序员。
    学习统计计算课程的学生。
   因此,本书不是R包中各种统计方法的纲要,其实本书更侧重于编程,覆盖了大部分R语言图书没有涉及的与编程相关的主题,我甚至是围绕编程主题展开论述的。下面是一些具体的例子:
   “扩展案例”展示完整的、特定用途的函数,而不是针对某个数据集的独立代码片段。你可能发现其中有些函数对你平常用R语言进行工作很有帮助。通过学习这些案例,你不仅能学到R语言的基本功能如何运作,也会学到如何把它们组合成有用的程序。在很多案例里,我讨论了其他设计方案,以回答“为什么我们这样做?”。
   内容上符合程序员的思维习惯。例如,在讨论数据框的时候,我不仅表明数据框是一种R的列表,也指出这一事实对编程的潜在影响。我在适当的时候加入R语言与其他语言的比较,为那些刚好了解其他语言的人提供参考。
   在任何语言里,调试对于编程都非常关键,而在其他大多数R语言书籍中却鲜有涉及。本书用了一章的篇幅来介绍调试技巧,用“扩展案例”方法真刀真枪地展示如何调试实际工作中的程序。
   如今,多核计算机甚至普及到普通家庭,图形处理单元(GPU)已经悄然在科学计算界引发了一场革命。越来越多的R应用涉及非常大量的计算,并行处理已经成为R程序员面临的主要课题。所以本书用一章的篇幅讨论这个主题,同样给出技术细节和扩展案例。
    本书单独用一章介绍如何利用R内部行为以及其他工具的优势来加速R代码。
   用一章来讨论R语言与其他语言(如C和Python)的接口,用扩展案例展示了应用方法,同时也介绍了调试的技巧。
我的学术背景
    我绕了一个圈才走进R的世界。
   我完成了抽象概率论领域的博士论文之后,在担任统计学教授的前几年,我教过学生、做过研究、也做过统计方法论的顾问。我是加州大学戴维斯分校统计系的创建者之一。
   后来我去了这个学校的计算机科学系,在那里我度过了职业生涯的大部分时间。我研究并行编程、网络流量、数据挖掘、磁盘系统性能以及其他领域。我在计算机科学领域的教学和研究大多都涉及统计学。
   所以我既有纯粹的计算机科学家的视角,也有作为统计学家和统计研究者的视角。我希望这样的综合视角能够使我更好地解读R语言,使本书更具实用价值。

免费在线读

  第1章
  快速入门
  如前言所述,R是一种针对统计分析和数据科学的功能全面的开源统计语言。它在商业、工业、政府部门、医药和科研等涉及数据分析的领域都有广泛的应用。
  本章将给出R的简单介绍——如何调用、能做什么以及使用什么文件。这里只介绍你在理解后面几章的例子时所需的基础知识,具体的细节将会在后面的章节中加以介绍。
  如果你的公司或大学允许,R可能已经安装在你的系统中。如果还没安装,请参考附录A中的安装指南。
  1.1 怎样运行R
  R可以在两种模式下运行:交互模式和批处理模式。常用的是交互模式。在这种模式下,你键入命令,R将显示结果,然后你再键入新的命令,如此反复进行操作。而批处理模式不需要与用户进行互动。这对于生产工作是非常有帮助的,比如一个程序必须定期重复运行,如每天运行一次,用批处理模式则可以让处理过程自动运行。
  1.1.1 交互模式
  在Linux或Mac的系统中,只需在终端窗口的命令行中键入R,就可以开始一个R会话。在Windows系统下,点击R图标来启动R。
  启动后显示的是欢迎语,以及R提示符,也就是>符号。屏幕的显示内容如下:
  现在就可以开始执行R命令了。这时候显示的窗口叫做R控制台。
  举个简单例子,考虑一个标准正态分布,其均值为0且方差为1。如果随机变量X服从这个标准正态分布,那么它的取值将以0为中心,或正或负,平均值为0。现在要生成一个新的随机变量Y=|X|。因为我们已经取了绝对值,Y的值将不会以0为中心,并且Y的均值也将是正值。
  下面来计算Y的均值。我们的方法基于模拟N(0,1)分布随机变量的取值:
  这行代码将会生成100个随机变量,计算它们的绝对值,然后计算它们绝对值的均值。
  标签[1]表示这行的第一项是输出结果的第一项。在这个例子中,输出结果只有一行(且只有一项),所以标签[1]显得有点多余。但是当输出结果有很多项会占据很多行时,这种标签会很有帮助。例如,输出结果有两行,且每行最多有6项,则第二行将会以标签[7]开头。
  在这里,输出结果有10个数值,举例来说,第二行的标签[7]可以让你快速判断出0.687701是输出结果的第8项。
  也可以把R的命令保存在文件里。通常,R代码文件都会有后缀.R或者.r。如果你创建一个名为z.R的文档,可以键入下面的命令来执行该文件中的代码:
  1.1.2 批处理模式
  有时候自动处理R会话能带来便利。例如,你可能希望运行一个用来绘图的R脚本,而不需要你亲自启动R来执行脚本,这时就要用批处理模式运行R。
  举个例子,文件z.R中是绘图的代码,内容如下:
  以#标记的部分是注释,它们会被R解释器忽略掉。注释的作用是以更易读的形式来提示代码的用途。
  下面一步步讲解前面代码的作用:
  调用pdf()函数告诉R我们想把创建的图形保存在PDF文件xh.pdf中。
  调用rnorm()函数(rnorm代表random normal)生成100个服从N(0,1)分布的随机变量。
  对这些随机变量调用hist()函数生成直方图。
  调用dev.off()函数关闭正在使用的图形“设备”,也就是本例中的xh.pdf文件。这就是实际上把文件写入磁盘的机制。
  我们可以自动运行上面的代码,而不用进入R的交互模式,只需要调用一条操作系统shell命令(例如通常在Linux系统中使用的$命令提示符)来调用R:
  用PDF阅读器打开保存的文件,可看到直方图(这里展示的只是简单的不加修饰的直方图,R可以生成更加复杂的图形),这表明上面的代码已执行。
  1.2 第一个R会话
  用数字1、2、4生成一个简单的数据集(用R的说法就是“向量”),将其命名为x:
  R语言的标准赋值运算符是<-。也可以用=,不过并不建议用它,因为在有些特殊的情况下它会失灵。注意,变量的类型并不是固定不变的。在这里,我们把一个向量赋值给x,也许之后会把其他类型的值赋给它。我们会在1.4节介绍向量和其他类型。
  c表示“连接”(英文是concatenate)。在这里,我们把数字1、2、4连接起来。更精确地说,连接的是分别包含三个数字的三个一元向量。这是因为可以把任何数字看作一元向量。
  接下来我们也可以这样做:
  这样就把q赋值为(1,2,4,1,2,4,8)(没错,还包括了x的副本)。
  我们来确认一下数据是不是真的在x中。要在屏幕上打印向量,只需直接键入它的名称。如果你在交互模式下键入某个变量名(或更一般的,某个表达式),R就会打印出变量的值(或表达式的值)。熟悉其他语言(比如Python)的程序员会觉得这个特性很熟悉。例如,输入下面的命令:
  果然,x包含数字1、2、4。
  向量的个别元素靠[ ]来访问。下面来看看如何打印x的第三个元素:
  正如在其他语言里一样,称选择器(这里的3)为索引(index)或者下标(subscript)。这些概念与ALGOL家族的语言(比如C和C++)类似。值得注意的是,R向量的元素的索引(下标)是从1开始的,而非0。
  提取子集是向量的一个非常重要的运算。下面是个例子:
  表达式x[2:3]代表由x的第2个至第3个元素组成的子向量,在这里也就是2和4组成的子向量。
  可以很容易求得本例中数据集的均值和标准差,如下:
  这里再次展示了在命令提示符下键入表达式来打印表达式的值。在第一行,表达式调用的是函数mean(x)。函数的返回值会自动打印出来,而不需要调用R的print()函数。
  如果想把求得的均值保存在变量里,而不是打印在屏幕上,可以执行下面的代码:
  同样,我们来确认一下y是否真的包含x的均值:
  正如前面提到过的,我们用#来加上注释,如下:
  注释对于写有程序代码的文档是很有价值的,不过在交互式会话中注释也很有用,因为R会记录命令历史(1.6节会讨论这一点)。如果你保存了会话,之后又恢复会话,注释可以帮你回忆起当时在做什么。
  最后,我们从R的内置数据集(这些数据集是用来做演示的)里取出一个做些操作。你可以用下面的命令得出一份这些数据集的列表:
  其中一个数据集名为Nile,包含尼罗河水流量的数据。我们来计算这个数据集的均值和标准差:
  我们还可以画出数据的直方图:
  此时会弹出一个包含直方图的窗口,如图1-1所示。这幅图是极其简单的,不过R有各种可选的变量来修饰图形。例如,可以通过设定breaks变量来改变分组;调用hist(z,breaks=12)可以画出数据集z的带有12个分组的直方图;还可以创建更漂亮的标签、改变颜色,以及其他一些改变来创建更有信息量且吸引眼球的图形。当你更熟悉R之后,就有能力构建更复杂、绚丽多彩的精美图形。
  图1-1 尼罗河数据的简单展示
  最后调用q()函数以退出R(另一种方法是,在Linux中按下快捷键CTRL-D,或者在Mac中按下CMD-D):
  最后一句提示是询问你是否希望保存变量以待下次运行时继续处理。如果回答y,则所有对象将会在下次启动R的时候自动加载。这是非常重要的特性,特别是在处理庞大的数据集或很多数据集时。回答y也会保存会话的命令历史。1.6节会继续介绍如何保存工作空间(workspace)和命令历史。
  1.3 函数入门
  和大多数编程语言一样,R语言编程的核心是编写“函数”。函数就是一组指令的集合,用来读取输入、执行计算、返回结果。
  我们先定义一个函数oddcount(),以此简单介绍函数的用法。这个函数的功能是计算整数向量中奇数的个数。一般情况下,我们会用文本编辑器编写好函数代码并保存在文件中,不过在这个简单粗略的例子中,我们只需要在R的交互模式中一行行输入代码。接下来,我们还会在几个测试案例中调用这个函数:
  首先,我们告诉R想定义一个名为oddcount的函数,该函数有一个参数x。左花括号引出了函数体的开始部分。本例中,每行写一条R语句。
  在函数体结束前,R会用+作为提示符,而不是用平常的>,以提醒用户现在还在定义函数。(实际上,+是续行符号,不是新输入的提示符。)在你键入右花括号来结束函数体之后,R又恢复使用>提示符。
  定义完函数之后,本例调用了两次oddcount()函数。由于向量(1,3,5)中有3个奇数,所以调用oddcount(c(1,3,5))的返回值为3。(1,2,3,7,9)有4个奇数,所以第二次调用的返回值为4。
  注意,在R中取余数的求模运算符是%%,见上面例子中的注释。例如,38除以7的余数为3。
  例如,我们看看下面代码的运行结果:
  首先,把x[1]赋值给n,然后测试n是奇数还是偶数。如果像本例中那样,n是奇数,则计数变量k增加。接着把x[2]赋值给n,测试其是奇数还是偶数,以此类推,重复后面的过程。
  顺便说一句,C/C++程序员也许会把前面的循环写成这样:
  在这里,length(x)是x的元素个数。假设x有25个元素。则1:length(x)就是1:25,意思是依次取1、2、3、……、25。上面的代码也能奏效(除非x的长度为0),但是R语言编程的戒律之一就是要尽可能避免使用循环,如果不能避免,就要让循环更简洁。重新看看这段代码原来的版本:
  它更简单清晰,因为我们不需要使用length()函数和数组下标。
  在代码的末尾,我们使用了return语句。
  这条语句把k的计算结果返回给调用它的代码。不过,直接像下面这样写也可以达到目的:
  在没有显式调用return()时,R语言的函数会返回最后计算的值。不过,这个方法必须慎重使用,7.4.1节会详细讨论这个问题。
  在编程语言的术语里,x是函数oddcount()的形式参数(英文名称是formal argument或formalparameter,简称“形参”)。在前面例子第一次调用函数时,c(1,3,5)称为实际参数(actualargument,简称“实参”)。这两个术语暗示了这样的事实:函数定义中的x只是个占位符,而c(1,3,5)才是在计算中实际用到的参数。同样,在第二次调用函数时,c(1,2,3,7,9)是实际参数。
  1.3.1 变量的作用域
  只在函数体内部可见的变量对这个函数来说是“局部变量”。在oddcount()中,k和n都是局部变量。它们在函数返回值以后就撤销了:
  需要注意的是,R函数中的形式参数是局部变量,这点非常重要。比如运行下面的命令:
  现在,假如oddcount()的代码改变了x的值,则z的值不会改变。调用oddcount()之后,z的取值还和之前一样。在计算函数调用的取值时,R会把每个实际参数复制给对应的局部参数变量,继而改变那些在函数外不可见的变量的取值。本书第7章将详细介绍“作用域法则”,上面提到的这些只是简单的例子。
  全局变量是在函数之外创建的变量,在函数内部也可以访问。下面是个例子:
  这里的y就是全局变量。
  可以用R的“超赋值运算符”(superassignmentoperator)<<-在函数内部给全局变量赋值,将在第7章详细介绍。
  1.3.2 默认参数
  R语言也经常用到“默认参数”。考虑下面这样的函数定义:
  如果程序员没有在函数调用时给y设定一个值,则y将初始化为2。同理,z也有默认值TRUE。
  现在考虑下面的调用:
  这里,数值12是x的实际参数,而且我们接受了y的默认值2,不过我们覆盖了z的默认值,将其设定为FALSE。
  上面这个例子也表明:与其他编程语言一样,R语言也有“布尔类型”,包括TRUE和FALSE两个逻辑值。
  注意 R语言允许TRUE和FALSE缩写为T和F。不过,如果你有名为T或F的变量,那么为了避免麻烦还是最好不要使用这样的缩写形式。
  1.4 R语言中一些重要的数据结构
  R有多种数据结构。本节将简单介绍几种常用的数据结构,使读者在深入细节之前先对R语言有个大概的认识。这样,读者至少可以开始尝试一些很有意义的例子,即使这些例子背后更多的细节还需要过一段时间才能揭晓。
  1.4.1 向量,R语言中的战斗机
  向量类型是R语言的核心。很难想象R语言代码或者R交互式会话可以一点都不涉及向量。
  向量的元素必须属于某种“模式”(mode),或者说是数据类型。一个向量可以由三个字符串组成(字符模式),或者由三个整数元素组成(整数模式),但不可以由一个整数元素和两个字符串元素组成。
  第2章将详细介绍向量。
  标量
  标量,或单个的数,其实在R中并不存在。正如前面提到的,单个的数实际上是一元向量。请看下面的命令:
  前面提到过,符号[1]表示后面这行的开头是向量的第一个元素,本例中为x[1]。所以可以看出,R语言确实把x当做向量来看,也就是只有一个元素的向量。
  1.4.2 字符串
  字符串实际上是字符模式(而不是数值模式)的单元素向量。
  第一个例子创建了数值向量x,也就是数值模式的。然后创建了两个字符模式的向量:y是单元素(也就是一个字符串)的向量,z由两个字符串组成。
  R语言有很多种字符串操作函数。其中有些函数可以把字符串连接到一起或者把它们拆开,比如下面的两个函数:
  第11章将会介绍字符串的细节。
  1.4.3 矩阵
  R中矩阵的概念与数学中一样:矩形的数值数组。从技术层面说,矩阵是向量,不过矩阵还有两个附加的属性:行数和列数。下面是一些例子:
  首先,使用函数rbind()(rbind是rowbind的缩写,意思是按行绑定)把两个向量结合成一个矩阵,这两个向量是矩阵的行,并把矩阵保存在m中(另一个函数cbind()把若干列结合成矩阵)。然后键入变量名,我们知道这样可以打印出变量,以此确认生成了我们想要的矩阵。最后,计算向量(1,1)和m的矩阵积。你也许已经在线性代数课程中学过矩阵乘法运算,在R语言中它的运算符是*。
  矩阵使用双下标作为索引,这点与C/C++非常相似,只不过下标是从1开始,而不是0。
  R语言的一个非常有用的特性是,可以从矩阵中提取出子矩阵,这与从向量中提取子向量非常相似。例子如下:
  第3章将会详细介绍矩阵。
  1.4.4 列表
  和R语言的向量类似,R语言中的列表也是值的容器,不过其内容中的各项可以属于不同的数据类型(C/C++程序员可以把它与C语言的结构体做类比)。可以通过两部分组成的名称来访问列表的元素,其中用到了美元符号$。下面是个简单的例子:
  表达式x$u指的是列表x中的组件u。列表x还包含另一个组件v。
  列表的一种常见用法是把多个值打包组合到一起,然后从函数中返回。这对统计函数特别有用,因为统计函数

R语言编程艺术(著名计算机科学家兼统计学家撰写,Amazon五星级畅销书,R语言领域公认经典著作) pdf下载声明

本pdf资料下载仅供个人学习和研究使用,不能用于商业用途,请在下载后24小时内删除。如果喜欢,请购买正版

pdf下载地址

版权归出版社和作者所有,下载链接已删除。如果喜欢,请购买正版!

链接地址:R语言编程艺术(著名计算机科学家兼统计学家撰写,Amazon五星级畅销书,R语言领域公认经典著作)