R的极客理想系列共2册(《R的极客理想——高级开发篇》、《R的极客理想——工具篇》)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-09-21 09:12:57

点击下载

作者:张丹

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

R的极客理想系列共2册(《R的极客理想——高级开发篇》、《R的极客理想——工具篇》)

R的极客理想系列共2册(《R的极客理想——高级开发篇》、《R的极客理想——工具篇》)试读:

前言

为什么要写这本书

本书是我写的“R的极客理想”系列丛书的第二本,主要介绍了R语言本身的核心技术、R语言的高级开发应用、R语言与其他学科及知识领域的跨学科综合应用。

其实,早在我的第一本书《R的极客理想——工具篇》中,就已经介绍了R语言的30多个工具包的使用方法,并以IT人的角度,告诉读者如何高效地使用第三方R包,把原有IT知识运用到R语言的学习过程中。但由于一本书的篇幅有限,《R的极客理想——工具篇》只讲了如何使用R语言,没有讲原理。

而本书将弥补这一遗憾,主要介绍R语言本身的核心技术:包括环境空间、面向对象、文件管理、数学计算、R包开发等主题。我希望通过这本书,可以让读者更深入地了解R语言、掌握R语言的核心技术、理解R语言的第三方包的特性,甚至可以自己动手开发出属于自己风格的优秀R包。说不定,不久的将来我会因用到你开发出来的R包而省力不少。

除此之外,本书的另一大亮点就是:R语言与其他学科知识在不同领域的跨学科综合应用。在书中,我将毫无保留地向读者展示:我是怎样将R语言与其他知识相结合,在不同领域让R大放异彩的。相信这部分内容会让很多读者眼前一亮,为之惊叹,原来R还可以这么玩儿!也希望这部分内容可以让大家有所启发,让各行业、各知识领域的朋友都可以接触R,运用R。时至今日,R语言已经不再是局限于科学家们使用的实验室语言,它已经具备了实际开发应用的能力,并且在挖掘数据价值、发现数据规律、创造数据财富等方面极具智慧和创造性!

如果把R语言比作一门武功,《R的极客理想——工具篇》就是兵器使用秘籍(比如什么“打狗棍法”啊、“独孤九剑”啊、“小李飞刀”啊),它可以帮助你在短时间内便捷、有效地提高工作效率,让你在R语言上的修为明显提高,但时间久了,你会因各种原因遇到自己的瓶颈,难以突破。

而本书则是武功的内功心法(比如什么《九阳真经》、《北冥神功》之类的,敬请对号入座,但别拿《葵花宝典》说事儿,谢谢),书中不仅介绍了R语言本身的核心技术,帮你打通任督二脉;而且着重讲述了R语言在实际使用过程中,如何与其他学科、领域结合运用,融会贯通,以无招胜有招,甚至自立门派成为一代宗师,这些都是有可能的!(咳咳,扯远了!)

在这里,我必须再次严肃地强调,本书不是R语言的入门书,零基础的朋友要先补充一些R语言的基础知识!本书包括R语言开发的高级内容,阅读本书,不但需要你有R语言使用经验,而且需要你具备一定的计算机背景知识和使用经验,只有这样,你才能更深刻地体会并运用书中的经验总结。

本书的内容完全是我在R语言的实际使用过程中总结而成的,基本都是我在工作中使用R语言的真实记录,以R语言的高级开发为主,其中还涉及计算机、统计、数学和金融四个学科的知识。

本书的核心内容包括两方面,一方面是R的高级编程,另一方面是跨界知识的综合运用。对于R的高级编程,本书详细总结了R语言的环境空间的定义和使用、文件系统管理、最新版本R 3.1.1的新特性,让你体会R语言的底层设计;全面介绍R语言中四种面向对象体系的程序设计和使用,通过面向对象的程序设计,让R语言有能力做出符合现实世界的复杂应用;另外还介绍了完整的R包开发流程,并提供每日中国天气的应用案例和游戏开发的案例,帮助读者创建自己的R包,打开R语言产品化的思路。

对于跨界知识的综合运用,R语言不仅可以用来非常方便地进行那些让人头疼的数学计算,无论是初等数学或者高等数学,概率或者统计都可以非常轻松、方便的,从此数学变得不再神秘莫测、遥不可及。用R语言还可以创建各种模型,书中算法案例包括协同过滤算法模型、基于矩阵计算的PageRank模型、金融的交易策略模型和遗传算法的使用。几行代码几分钟,就可以让我们头脑中的想法变成可运行的算法原型。

另外,虽然R不是特别适合开发游戏,但如果真用R语言开发游戏2048,也就需要200行代码,还有哪种语言可以匹敌呢?说到这里肯定有人问:“你为什么要用R开发游戏啊?”“为什么不用Java开发啊?”“我不用R开发,用Java开发不是也一样么?”其实,我就是想用这种方式向大家展示R语言简洁的风格、自由的思想、极富想象的创造力,希望用我这个“R极客”的玩耍心态,引发大家对R的无限想象!最后,我们把模型产品化,发布一个属于自己的R包,让全世界的人都能使用,这是一件多么令人兴奋的事情。

在与各界R语言使用者的交流中,我发现,有编程背景的使用者可以写出干净漂亮且运行高效的代码,但由于欠缺统计知识,对模型优化就只能束手无策、无可奈何了;而那些具备统计背景的使用者,虽然可以独立完成一个模型的设计和优化,但对于如何产品化实施就完全找不到办法了。

本书介绍了多个场景案例,不仅从学术的角度完成了模型的设计,而且用计算机的方法实现产品。通过案例的学习,不同学科背景的R语言使用者可以站在其他人的角度,找到新的思维方法。这是本书的又一大亮点!

对于大多数程序员来说,学习R语言比较轻松容易,但运用R语言却非常困难。R语言虽然没有像C/C++一样的复杂程序语法,也不用像Java一样宏观考虑全局架构,更没有JavaScript一样灵活,但是,R语言面向数据本身的编程思想是完全有别于其他编程语言的,这就使得很多程序员在使用R语言时虽然理解语法,但依旧不知道如何应用。

我认为,学习R语言是为了找到个性化的自己,定位自己,综合运用自身的知识进行跨学科创新,而不是去复制别人的想法。R语言的跨界运用,需要你具备基础学科(初等数学、高等数学、线性代数、概率论、统计学)+业务知识(金融、生物、互联网)+IT技术(R语法、R包、数据库、算法)的综合能力,所以只有提升自己的综合知识水平,才能真正地学好R语言。换句话说,一旦你学成R语言,你将是不可替代的。

在此,我不得不再次强调,本书不是入门图书,而是R语言的高级开发图书。本书不讲R的入门语法,也不介绍R语言第三方包的使用。但是,如果你已经具备了一定的R语言基础,想把自己的R语言模型产品化,那么我将告诉你如何提高程序的可靠性和可扩展性,以及如何发布属于自己的R包。

本书是“R的极客理想”系列图书的第二本,第三本《R的极客理想——量化投资篇》将介绍R语言在金融领域的应用,通过R语言构建交易模型,并实现自动化交易的过程,真正地让技术人员把自己的知识变成价值。

本书的使用环境包括Linux Ubuntu和Windows 7两种操作系统,在每一节中都有明确的标识,所有的程序都是在R语言3.1.1版本中测试通过的。

R语言还在不断地进步,它将引导一场数据的革命,跨学科的结合是时代趋势,也是我们的机遇!读者对象

本书适合以下所有R语言工作者:

·计算机背景的软件工程师;

·R语言的高级使用者;

·数据分析背景的数据科学家;

·统计背景的科研工作者;

·开设相关课程的院校学生。如何阅读本书

本书的内容分为三个部分。第一部分是R的计算和算法应用(第1~2章),介绍了R语言的知识体系结构,R语言对基础学科的支持,以及通过基础学科实现各种算法,可帮助读者快速了解R语言中的数学计算方法和自定义模型算法开发。

第二部分是深入R语言程序开发(第3~4章),介绍了R语言内核相关的编程,包括环境空间的定义和使用,以及面向对象方法的程序设计和使用,可帮助读者深入了解R语言的底层知识,用面向对象的方法设计复杂的程序结构。

第三部分是开发自己的R包(第5~6章),介绍了R包开发的完整流程,并提供每日中国天气的应用案例和游戏开发的案例,可帮助读者创建自己的R包,打开R语言产品化的思路。

本书有很多综合运用的知识,在阅读本书的时候,建议读者顺序阅读全部的章节。勘误和支持

由于笔者的水平有限,加之编写时间仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。为此,笔者创建了一个在线的图书交流网站(http://onbook.me),方便与读者进行沟通。如果读者在阅读过程中遇到问题,也可以在官方网站中留言,我将尽量在线上为你提供最满意的解答。书中的全部源代码,都可以从华章公司网站(www.hzbook.com)或本书交流网站下载,我也会及时更新代码。如果你有什么宝贵意见,欢迎发送邮件至bsspirit@gmail.com,期待能够得到你真挚的反馈。致谢

感谢我的创业团队成员林伟林和林伟平,是R语言让我们走在了一起。感谢机械工业出版社华章公司的编辑明永玲,帮助我审阅全部章节,引导我顺利完成书稿。感谢我的爸爸、妈妈和爱人,感谢你们对我工作上的支持和生活上的照顾!

谨以此书献给我最亲爱的家人以及众多R语言爱好者们!

张丹

2014年11月于中国北京第一部分 R的计算和算法应用■第1章 R语言知识体系和数学函数■第2章 R语言的算法实现第1章 R语言知识体系和数学函数

本章为全书开篇,主要介绍了R语言知识体系结构及学习资料。利用R语言实现数学计算和统计计算以及连续型分布函数的可视化,可帮助读者全面理解R语言,并利用R语言快速地处理基础学科的计算问题。1.1 R语言知识体系概览问题

如何高效地学习R语言?引言

最近遇到很多想转行做数据分析的程序员,他们刚开始学习R语言。很多人以为有了其他语言的编程背景,学习R语言就是一件很简单的事情,因而一味地追求速度,但不求甚解。有人说2周就能掌握R语言,但其实掌握的仅仅是R语言的语法,只能算是入门。

R语言的知识体系并非语法这么简单,如果都不了解R的全貌,何谈学好R语言呢?本节将介绍R语言的知识体系结构,并告诉读者如何才能高效地学习R语言。1.1.1 R语言的知识体系结构

R语言是一门统计语言,主要用于数学建模、统计计算、数据处理、可视化等几个方向,R语言天生就不同于其他的编程语言。R语言封装了各种基础学科的计算函数,我们在R语言编程的过程中只需要调用这些计算函数,就可以构建出面向不同领域、不同业务的、复杂的数学模型。掌握R语言的语法,仅仅是学习R语言的第一步,要学好R语言,需要你要具备基础学科能力(初等数学、高等数学、线性代数、离散数学、概率论、统计学)+业务知识(金融、生物、互联网)+IT技术(R语法、R包、数据库、算法)的结合。所以只有把自己的综合知识水平提升,才真正地学好R语言。换句话说,一旦你学成了R语言,你将是不可被替代的。

1.R语言的知识体系结构概览

R语言的知识体系结构是复杂的,要想学好R语言,就必须把多学科的知识综合运用,所以最大的难点不在于语言本身,而在于使用者的知识基础和综合运用多学科知识的能力。

首先,让我们从宏观上来看R语言的知识体系结构的全貌,如图1-1所示,然后再分别解释每部分的细节。图1-1 R语言的知识体系结构概览

图1-1中我将R语言知识体系结构分为3个部分:IT技术+业务知识+基础学科。这仅仅是我对R语言的理解,不排除由于个人阅历有限导致观点片面的问题。

IT技术是计算时代必备的技术之一,R语言就是一种我们应该要掌握的技术。

业务知识是市场经验和法则,不管你在什么公司,都会有自己的产品、销售、市场等,你要了解你的公司有什么产品,客户是谁,怎么才能把产品卖给你的客户。

基础学科是我们这十几年在学校学的理论知识,当初学的时候并不知道是为了什么,毕业后如果你还能掌握一些知识并实际运用,那么这将是你最有价值的竞争力。

每个部分的知识单独看都有其局限性,但如果能把知识两两结合起来,就构成了我们现在的各种技术的创新点。

IT技术+业务知识:创造了阿里巴巴的电子商务帝国,还有腾讯全生态链的社交网络。

IT技术+基础学科:创造了Google搜索的神话,还有华尔街金融不败的帝国。

当然,R语言只是一门计算机语言技术,不能独自承担改写历史的重任,但R语言确实给了我们很大的想象空间,让我们能动手去了解这个世界的规律,找到无穷无尽的交叉点,创造出新的帝国。

如果你和我一样,都能站在这个角度来学习和使用R语言,那么我们一定可以成为并肩向前的同路人。

2.R语言的基础知识

蓝图总是宏大和美好的,但具体落实将是困难重重的。接下来,我将会梳理思路,把所有的知识点对应到可操作的文档上,希望帮助大家掌握R语言的全貌!

R语言的基础知识,包括R语言的语法、R语言核心包的使用、R语言的内核编程、R语言包的开发以及R语言的虚拟机。(1)R语言的语法

语法是我们了解R语言的第一步,和所有人一样,我也曾在很短的时间内就掌握了R语言的语法规则、数据结构、基本类型和常用函数等,但其实R语言语法上的坑,远比你知道的多得多。

我举个例子,看谁能准确地回答。比如,最基础的符号操作“=”“<-”“<<-”,三者有什么区别?分别在什么时候用?不要说问题太偏了,实际根本用不到。我的代码里处处都在用这3个符号,只是你不知道而已。在学习R语言的时候,不要用已经掌握的C、Java、Python的经验直接去套R语言的语法,掉坑里的就是这些人。要从头开始学,一路上没有捷径。

R语言是函数式语言,语法自由,命名自由,使用简单,这只是对于普通用户来说的。作为一个有理想的极客,怎么能只停留在语法上呢?R语言是完全面向对象的,你了解什么是面向对象吗?R语言的面向对象打破了R语言原有的自由,但又要兼容原有的自由语法,多么纠结的设计啊,你能体会到吗?并不是记住了R语言的语法,就代表掌握了R语言。里面各种坑,只有自己踩了,再自己爬出来,才是真正的成长。(2)R语言核心包的使用

R语言同其他语言一样,在软件启动时,为我们提供了7个核心包,其中包括众多的基础函数,如数学计算函数、统计计算函数、日期函数、包加载函数、数据处理函数、函数操作函数和图形设备函数等。通过search()函数,可以查看到R启动时默认加载7个核心包。> search() # 查看当前环境已加载的R包[1] ".GlobalEnv" "package:stats" "package:graphics"[4] "package:grDevices" "package:utils" "package:datasets"[7] "package:methods" "Autoloads" "package:base"

这7个核心包就是我们构建复杂模型的基础。由于这几个核心包比较底层,很多函数都是用C语言封装的,没有R语言的源代码,而且除了官方文档,几乎没有其他更详细的文档介绍,所以这几个核心包就是学习的门槛。

再问个问题,R语言的所有操作都是函数操作,那么“a<-1:10”语句会被解析为对应什么函数?> a<-1:10;a # 赋值 [1] 1 2 3 4 5 6 7 8 9 10

答案是,“1:10”对应“seq()”,“<-”对应assign()。> assign('b',seq(1:10));b # 通过函数赋值 [1] 1 2 3 4 5 6 7 8 9 10

这种对应关系的意义在于,因为R语言是解释型语言,我们可以通过传递一个函数A的句柄,让其他的函数B动态调用这个函数A,这就是动态语言中的闭包特性的使用思路。这种思路在JavaScript中已经被广泛使用了,但在R语言中,却只有核心包的一些函数使用这种语法。在R语言中,这种需要有计算机背景知识的地方还有很多,特别是在考虑如何提升R语言的性能时。所以,不要轻易说自己掌握了R语言,要多想想如何才能把其他语言的基础带到R语言的世界里。(3)R语言的内核编程

R语言的内核编程又是一个比较复杂的计算机学科的问题。R语言的内核编程应该包括哪些内容呢,除了刚才说的R语言的语法和R的核心包,还有面向对象编程、向量化计算、特殊数据类型、环境空间等。本书将会重点介绍这些内容。

面向对象编程是一种理解和抽象现实世界的方法,主要用于解决复杂问题的设计及实现。在Java的世界里,从2003年我开始接触Java的时候,社区就已经在聊面向对象的程序设计了。对于R语言来说,直到2011年发布的2.12版本,才最终有了RC类型的面向对象实现。面向对象的成熟,标志着R语言已经具备了构建复杂大型应用的能力,但如何真正地把面向对象用好,似乎也并不是统计人擅长的。像Hadley Wickham那样有能力写出面向对象代码的人,在R语言的圈子里,实在是太少了。

向量化计算是R语言特有的一种并行计算方式。在R语言中,向量(vector)是R的基本数据类型,当你对一个向量进行操作时,程序会对向量中的每个元素分别计算,计算结果以向量的形式返回。比如,最常见的两个等长的向量相加。> 1:10+10:1 # 两个向量相加 [1] 11 11 11 11 11 11 11 11 11 11

向量化计算,在R中有很广泛的应用场景,基本可以取代循环计算,高效地完成计算任务。我们定义两个向量,先相加再求和,run1()函数用向量化计算实现,run2()用循环方法实现。> a<-1:100000> b<-100000:1> run1<-function(){ # 向量化计算+ sum(as.numeric(a+b))+ }> run2<-function(){ # 循环计算+ c2<-0+ for(i in 1:length(a)){+ c2<-a[i]+b[i]+c2+ }+ c2+ }> system.time(run1()) # 统计run1()函数的执行时间用户  系统  流逝 0 0 0> system.time(run2()) # 统计run2()函数的执行时间用户 系统 流逝0.14 0.00 0.14

通过运行程序,我们可以清楚地看出,向量化计算要比循环快。当算法越复杂数据量越大的时候,计算的时间差距会越明显。R语言的编程中的一条经验法则就是用向量计算代替所有的循环计算。

R语言中除了那些基本的数据类型,还有一些高级的特殊数据类型,这些特殊数据类型并不是不常用,而是你不知道。S3类型、S4类型、RC类型分别对应R语言支持的三种面向对象编程的数据结构。环境(environment)类型是由内核定义的一个数据结构,由一系列有层次关系的框架(frame)组成,每个环境对应一个框架,用来区别不同的运行时空间(scope)。

在进行R包开发时,环境空间是必须知道的一个知识点。每个环境空间都是环境类型的一个实例。每个R包都会被加载到一个环境空间中,形成有层次关系的、可调用的空间结构。

我们定义的函数和变量都会存在于R语言的环境空间中,通过ls()就可以看到当前环境空间中的这些变量,比如,刚才向量化计算定义的变量和函数。> ls() # 查看当前环境空间的变量[1] "a" "b" "run1" "run2"

除了我们自己定义的变量和函数之外,环境空间中还有很多其他的变量和函数,比如sum()、length()、system.time()等,我们可以直接使用这些函数,但是它们并不在当前环境空间中,所以直接用ls()是查看不到的。当切换到base的环境空间时,就可以找到sum()的函数定义了。> ls(pattern="^sum$",envir=baseenv()) # 查看base环境空间的变量[1] "sum"

R语言的内核编程,如同其他语言一样,包括很多的知识细节,并不是只有我提到的这几点。但由于缺少文档,同时R核心技术不普及,所以知道的人不多,会用的人就更少。笔者也在每天探索,期待发现更多的秘密。(4)R语言包的开发

R语言包的开发是R语言编程中比较困难但又不得不面对的问题,不仅要把上文中所提到的各种R语言技术综合运用在一起,还要符合R语言包的开发规范,并用Latex写好文档,最后提交给CRAN发布。技术问题虽然难,花时间还是可以解决的,但想要在CRAN上发布,那就只能用“难于上青天”来形容了。R语言发展了20多年,只有5000多个包在CRAN上发布,审核不是一般严格啊!我写的gridgame游戏包和chinaWeather天气包,改了很多次都没能通过,都快到要放弃的边缘了。

换个角度想,只有审核严格才能保证用户在安装第三方R语言包的时候不会出错。由于CRAN的审核过于严格,Hadley Wickham也受不了了,他又开发了devtools包,不仅提供了简化R语言包的开发的工具函数,还支持Github社区发布。这样就可以脱离CRAN的束缚,以个人的名义发布各种奇思妙想的R语言包,甚至是“不误正业”的R语言包。(5)R语言的虚拟机

终于该说我不熟悉的话题了,从我3年多的R语言使用经验来说,还碰不到R语言的虚拟机。不过,网上看到很多高手在生产环境都会重新编译R软件,比如用OpenBLAS加速R的矩阵运算,在虚拟机层实现矩阵的并行化计算,也有用GPU实现矩阵并行计算的;还有牛人把R实现的各种算法都用C++重新实现,然后通过Rcpp封装,直接与R语言的虚拟机进行连接调用。

3.R语言的第三方包

R语言的第三方包,主要包括在CRAN上的5000多个第三方包,以及其他社区中的R语言包,这些包在各种领域中都发挥着重要的作用。在《R的极客理想——工具篇》一书中,我介绍了30多个包的使用,包括基础工具包(fortunes,formatR,rjson,RJSONIO,Cairo,CaTools)、时间序列包(zoo,xts,xtsExtra)、性能监控包(memoise,profr,lineprof)、R跨平台通信包(Rserve,Rsession,rJava)、R服务器包(Rserve,RSclient,FastRWeb,Websocket)、数据库访问包(RMySQL,rmongodb,rredis,RCassandra,RHive),Hadoop操作包(rhdfs,rmr2,rhbase)等。

还有很多常用的包,比如数据处理包(lubridate,plyr,reshape2,stringr,formatR,mcmc)、机器学习包(nnet,rpart,tree,party,lars,boost,e1071,BayesTree,gafit,arules)、可视化包(ggplot2,lattice,googleVis)、地图包(ggmap,RgoogleMaps,rworldmap)等。

R语言对于金融也有很好的支持,有时间序列包(zoo,xts,chron,its,timeDate)、金融分析包(quantmod,RQuantLib,portfolio,quantstrat,blotter,PerformanceAnalytics,TTR,sde,YieldCurve)、风险管理包(parma,evd,evdbayes,evir,extRemes,ismev)等。同时,笔者正在量化投资的创业中,R语言作为系统架构中的算法引擎是在最核心的位置,R语言正用在最有价值的业务中,在后续的《R的极客理想——量化投资篇》一书中,我将会完整地介绍R语言在量化投资系统中的运用。

4.数学的基础知识

数学的基础知识主要包括初等数学、高等数学、线性代数、概率论、统计学等。我们在大学中曾经学过的各种数学,那些不知道有什么用,只为考试而学的数学,是能真正决定R语言掌握深度的基础知识。

当R语言普及、变成大众化的编程语言以后,入门会越来越容易,第三方包的调用会越来越简单,最后就是拼基础学科功底了,数学就是对所有人来说最难的基础学科。

初等数学,咱们中国人一直都在强调数学是我们的优势,其实强的部分仅限于初等数学,加法口诀和乘法口诀让我们可以口算100以内的四则运算。

高等数学,可能是大学里挂科最多的一门课,很多老师照本宣科让很多学生完全不知所云。直到遇到R,我才恍悟为什么最小二乘法能进行最优化的计算。重新捡起高数是学R的必经之路。

线性代数,直到读完Google的PageRank论文的N年后,我自己才想明白,原来矩阵可以处理海量数据的计算,实现分步式算法与单机算法的一致性。

概率论,通过R语言进行各种分步的随机实验,并把概率密度函数曲线应用到实际的业务中,才让我们理解概率才是可以衡量客观事件发生的指标。

统计学,通过R语言我们可以很简单地构建各种统计模型,利用Bayes分类器判断垃圾邮件,利用回归模型预测未来的房价。

是R语言能让我切身地感受到,数学的基础知识在我们实际生活中的运用;也是R语言拉近了学术界和工业界的距离。如果能把我们从小到大学到的知识串起来,我想每个人都会具备与众不同的知识结构,将会在各行各业实现伟大的创新。

5.业务知识

业务知识涉及的面非常广,每个人都可以利用自身所处行业的知识,并结合R语言擅长的领域,发现新的机会。R语言擅长的领域包括统计分析、金融分析、数据挖掘、互联网、生物信息学、生物制药、全球地理科学、数据可视化等。

我在软件和互联网行业待了10年,亲身经历了两个行业的高速发展和变迁。技术一波又一波,每年都有新的主题,一路跟下来的人越来越少,虽然新鲜的血液不断补充着,但这些“血液”的能力和经验却远达不到要求,被市场的浮躁扰动着。近些年,中国的创业公司的成功,少有技术创新,大都是商业模式创新和资本运作的成功。

面对着中国资本市场,掌握好业务方面的知识,就是找到了赚钱的法宝。当业务成熟,在大家都懂得游戏规则后,竞争就会变得异常激烈了,像电商、团购、旅游、酒店、游戏都是如此。新领域新业务,才是值得80后90后年轻人奋斗的方向。如火如荼的O2O、互联网金融、物联网、机器人,也许正是2015年的爆发点。如果你又懂技术又懂业务,学习能力又强,你将是下一个帝国的创造者。

6.跨学科的综合运用能力

再次强调,只要把多种学科知识综合运用,不仅能够成为R语言的一代高手,更能够实现自我的价值。

当IT技术与业务知识完美结合,你会在新兴的市场找到机会。一旦市场成熟后,业务竞争就会变成资本竞争,机会将不复存在。

当IT技术与基础学科相结合,你可以通过科技创新,建立技术壁垒,保持技术优势直到成为行业老大。

如果IT技术、业务知识、基础学科三者同时具备,那么你将是不可被替代的。只要找到属于你的团队,研发出自己的产品,推广给你的用户,你就已经成功了!

R语言可以从IT的角度帮助你实现成功,同时你的成功也将是R语言的成功!1.1.2 R语言学习

花了很大的篇幅,终于把我理解的R语言的知识体系解释清楚了。那么接下来,我们应该如何高效地学习R语言呢?有句话要说在前头,学习是艰苦的,没有捷径可言,如果你想成功,那么更要面对苦中之苦。正确的学习方法,可以让我们少走弯路,学习别人的经验,会让我们加速成长。

通过上文中对跨学科知识体系的描述,我想大家都应该明白了,要想学好R语言,最大的难点不在于语言本身,而在于使用者的知识基础和综合运用知识的能力。当然,综合运用是要以良好的基础知识为前提的,先抛开业务知识和基础学科的知识不说,只谈IT技术,应该要掌握哪些知识呢?

1.IT基础知识

对于R语言本身来说,我们需要掌握R语言的基础知识,包括R的语法、R核心包的使用、R语言的内核编程、R语言包的开发以及与业务相关的第三方R语言包的使用。

如果你在学习R语言之前,已经有了很多的Java、Python等编程语言的经验,那么这将帮助你很快熟悉R语言,你只要再补充一些数据分析和数据挖掘算法的知识,就能马上将R语言用在实际的工作中了。

如果你之前是SAS或Matlab数据科学家,那你只需要熟悉R语言的编程语法和第三方R语言包,就能用R语言来完成SAS和Matlab的所有任务。

如果你是BI程序员,平时工作经常有处理数据和可视化的任务,那么你可以边学习R语言边补充一些统计方面的知识,从无味的ETL[1]过程中发现数据的价值。

如果你是一名在读的统计学专业学生,R语言将帮助你把书本上枯燥的知识程序化,让你在学习过程中发现社会的规律。

如果你一直在用Excel并抱怨其功能远远不够,请试一下R语言,你的想法很快就会变成你财富的源泉。

如果你是一名宽客(Quant),还不懂R语言的话,那么你很快就会被市场淘汰。

如果你是一名Hadoop算法工程师,用Java写一个MR算法通常要好几千行,你可试试用RHadoop,十分之一的代码行就可以完成同样的事情。

还有很多可举例说明的故事。R语言可以与各种技术、各种思路相结合,让R语言和你已掌握的知识进行碰撞,你就会变得和别人不一样。

2.R语言中文图书

邓一硕(博客http://yishuo.org)曾经写过一篇名为《R语言书籍的学习路线图书》的博文,这篇文章很有参考意义。文章分别介绍了R语言的初级入门、高级入门、绘图与可视化、计量经济学、时间序列分析和金融等内容,涉及30多本R语言图书和小册子,但大部分是英文的。

随着时间的推移,这两年R语言方面又增加了好多本新书,中文图书也慢慢地多了起来。我重新定义的R语言中文图书学习路线图,如图1-2所示。图1-2 R语言中文图书学习路线图

对于不同层次的R语言用户,也有了市场细分。入门的朋友可以从《R语言编程艺术》开始学习;有一定R语言基础的朋友可以阅读《R语言实战》;需要扩展知识面的朋友可以阅读《R的极客理想——工具篇》;在掌握了R语言的各种入门技术后,高级的R语言开发者可以阅读本;用R做可视化的朋友,可以阅读《ggplot2:数据分析与图形艺术》;正在学习统计学的朋友,可以阅读《统计建模与R软件》;准备用R做金融的朋友,可以阅读《时间序列分析及应用:R语言(原书第2版)》和《金融数据分析导论:基于R语言》。

以上推荐的图书,我都亲自读过,予以品质保证。此图书列表将在我的博客中不定期更新,把我读到的好书分享给大家!

3.R语言中文社区

除了图书,中文的R语言社区和个人博客也在蓬勃发展。统计之都是中国大陆最权威的R语言组织,其中不仅积累了大量高质量的R语言文章,并主办了七届中国R语言会议。统计之都团队成员,还参与翻译了《R语言编程艺术》《R语言实战》《ggplot2:数据分析与图形艺术》《R语言核心技术手册(第2版)》《R数据可视化手册》《R语言统计入门(第2版)》等多本图书。

炼数成金论坛,以数据分析为主题,设有R语言板块,提供在线的R语言入门培训,黄志洪老师的算法讲解超一流。

人大经济论坛,以经管教育为主题,设有R语言板块,以线下培训为主。

4.R语言中文博客

笔者的个人博客——粉丝日志(http://blog.fens.me),原创了大量的R语言技术实战文章,包括R的极客理想系列文章、RHadoop实践系列文章、R利剑NoSQL系列文章,并写作“R的极客理想”系列图书。

谢益辉的个人博客(http://yihui.name),博客中主要包括各种有趣的技术和吐槽文章。谢益辉是统计之都的创始人,现任RStudio公司程序员。

刘思喆的个人博客——贝吉塔行星(http://www.bjt.name),博客中主要包括R语言企业级应用的文章。刘思喆现任京东推荐算法经理。

李舰的个人博客(http://jliblog.com),博客中主要包括R语言建模的文章。李舰现任Mango Solutions中国区数据总监。

邓一硕的个人博客——格物堂(http://yishuo.org),博客中主要包括R语言金融数据分析的文章。

阿稳的个人博客——不周山(http://www.wentrue.net/blog),博客中主要包括R语言并行技术的文章。

最后,祝大家把R语言学好用好,在各自的领域中找到创新的突破口,实现自我价值,然后反馈给R语言社区,加速R语言的发展壮大。

[1] ETL即数据抽取(Extract)、转换(Transform)、装载(Load)的过程。1.2 R语言中的数学计算问题

如何用R语言进行数学计算?引言

R语言是统计语言,生来就对数学有良好的支持,用R语言做数学的计算题特别方便。如果计算器中能嵌入R语言的计算函数,那么绝对是一种高科技产品。我真的把R语言当成我的计算器了!1.2.1 基本计算

R语言对数学计算有着非常好的支持,本节将完整介绍初等数学中的各种计算操作。

本节的系统环境是:

·Windows 7 64bit

·R:3.1.1 x86_64-w64-mingw32/x64(64-bit)

用R语言实现四则运算操作,包括加、减、乘、除、余数、整除、绝对值、判断正负。> a<-10;b<-5 # 定义2个变量> a+b;a-b;a*b;a/b # 加减乘除[1] 15[1] 5[1] 50[1] 2> a%%b;a%/%b # 余数,整除[1] 0[1] 2> abs(-a) # 绝对值[1] 10> sign(-2:3) # 判断正负[1] -1 -1 0 1 1 1

用R语言实现数学计算操作,包括幂、自然常数e的幂、平方根、对数。> a<-10;b<-5;c<-4 # 定义3个变量> c^b;c^-b;c^(b/10) # 幂运算[1] 1024[1] 0.0009765625[1] 2> exp(1) # 取自然常数e[1] 2.718282> exp(3) # 自然常数e的幂[1] 20.08554> sqrt(c) # 平方根[1] 2> log2(c) # 以2为底的对数[1] 2> log10(b) # 以10为底的对数[1] 0.69897> log(c,base = 2) # 自定义底的对数[1] 2> log(a,base=exp(1)) # 自然常数e的对数[1] 2.302585> log(a^b,base=a) # 指数对数操作[1] 5> log(exp(3))[1] 3

用R语言实现比较计算操作,包括==、>、<、!=、<=、>=、isTRUE、identical。> a<-10;b<-5 # 定义2个变量> a==a;a!=b;a>b;a=c # 比较计算[1] TRUE[1] TRUE[1] TRUE[1] FALSE[1] FALSE[1] TRUE> isTRUE(a) # 判断是否为TRUE[1] FALSE> isTRUE(!a)[1] FALSE> identical(1, as.integer(1)) # 精确比较两个对象[1] FALSE> identical(NaN, -NaN)[1] TRUE> f <- function(x) x> g <- compiler::cmpfun(f)> identical(f, g)[1] TRUE

用R语言实现逻辑计算操作,包括&、|、&&、||、xor。> x<-c(0,1,0,1) # 定义2个向量> y<-c(0,0,1,1)> x && y;x || y # 只比较向量的第一个元素 &&, ||[1] FALSE[1] FALSE> x & y;x | y # S4对象的逻辑运算,比较所有元素 &, |[1] FALSE FALSE FALSE TRUE[1] FALSE TRUE TRUE TRUE> xor(x,y) # 异或比较[1] FALSE TRUE TRUE FALSE> xor(x,!y)[1] TRUE FALSE FALSE TRUE

用R语言实现约数计算操作,包括ceiling、floor、trunc、round、signif。> ceiling(5.4) # 向上取整[1] 6> floor(5.8) # 向下取整[1] 5> trunc(3.9) # 取整数[1] 3> round(5.8) # 四舍五入[1] 6> round(5.8833, 2) # 四舍五入,并保留2位小数[1] 5.88> signif(5990000,2) # 四舍五入,保留前2位整数[1] 6e+06

用R语言实现数组计算操作,包括求最大值、求最小值、范围、求和、均值、加权平均、连乘、差分、秩、中位数、分位数、任意数、全体数。> d<-seq(1,10,2);d # 定义1个向量[1] 1 3 5 7 9> max(d);min(d);range(d) # 求最大值、最小值、范围range[1] 9[1] 1[1] 1 9> sum(d);mean(d) # 求和、均值[1] 25[1] 5> weighted.mean(d,rep(1,5)) # 加权平均[1] 5> weighted.mean(d,c(1,1,2,2,2))[1] 5.75> prod(1:5) # 连乘[1] 120> diff(d) # 差分[1] 2 2 2 2> rank(d) # 秩[1] 1 2 3 4 5> median(d) # 中位数[1] 5> quantile(d) # 分位数0% 25% 50% 75% 100%1 3 5 7 9> any(d<5);all(d<5) # 任意条件any,全体条件all[1] TRUE[1] FALSE

用R语言实现排列组合计算操作,包括阶乘、组合、排列。> factorial(5) # 阶乘5![1] 120> choose(5, 2) # 组合,从5个中选出2个[1] 10> combn(5,2) # 列出从5个中选出2个的所有组合项 [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10][1,] 1 1 1 1 2 2 2 3 3 4[2,] 2 3 4 5 3 4 5 4 5 5> for (n in 0:10) print(choose(n, k = 0:n)) # 计算0:10的组合个数[1] 1[1] 1 1[1] 1 2 1[1] 1 3 3 1[1] 1 4 6 4 1[1] 1 5 10 10 5 1[1] 1 6 15 20 15 6 1[1] 1 7 21 35 35 21 7 1[1] 1 8 28 56 70 56 28 8 1[1] 1 9 36 84 126 126 84 36 9 1[1] 1 10 45 120 210 252 210 120 45 10 1> choose(5, 2)*factorial(2) # 排列,从5个中选出2个[1] 20

用R语言实现累积计算操作,包括累加、累乘、最小累积、最大累积。> cumsum(1:5) # 累加[1] 1 3 6 10 15> cumprod(1:5) # 累乘[1] 1 2 6 24 120> e<-seq(-3,3);e # 定义一个向量[1] -3 -2 -1 0 1 2 3> cummin(e) # 最小累积cummin[1] -3 -3 -3 -3 -3 -3 -3> cummax(e) # 最大累积cummax[1] -3 -2 -1 0 1 2 3

用R语言实现两个数组的计算操作,包括取交集、并集、差集、数组是否相等、取唯一、查匹配元素的索引、找重复元素索引。> x <- c(9:20, 1:5, 3:7, 0:8);x # 定义两个数组向量 [1] 9 10 11 12 13 14 15 16 17 18 19 20 1 2 3 4 5[18] 3 4 5 6 7 0 1 2 3 4 5 6 7 8> y<- 1:10;y[1] 1 2 3 4 5 6 7 8 9 10> intersect(x,y) # 交集[1] 9 10 1 2 3 4 5 6 7 8> union(x,y) # 并集 [1] 9 10 11 12 13 14 15 16 17 18 19 20 1 2 3 4 5[18] 6 7 0 8> setdiff(x,y) # 差集,从x中排除y [1] 11 12 13 14 15 16 17 18 19 20 0> setequal(x, y) # 判断是否相等[1] FALSE> unique(c(x,y)) # 取唯一 [1] 9 10 11 12 13 14 15 16 17 18 19 20 1 2 3 4 5[18] 6 7 0 8> which(x %in% y) # 找到x在y中存在的元素的索引 [1] 1 2 13 14 15 16 17 18 19 20 21 22 24 25 26 27 28[18] 29 30 31> which(is.element(x,y)) # 同%in% [1] 1 2 13 14 15 16 17 18 19 20 21 22 24 25 26 27 28[18] 29 30 31> which(duplicated(x)) # 找到重复元素的索引 [1] 18 19 20 24 25 26 27 28 29 301.2.2 三角函数计算

1.三角函数

在直角三角形中仅有锐角(大小在0~90度之间的角)三角函数的定义。给定一个锐角θ,可以做出一个直角三角形,使得其中的一个内角是θ。设这个三角形中,θ的对边、邻边和斜边长度分别是a、b和h,如图1-3所示。图1-3 直角三角形

三角函数的6种关系:正弦、余弦、正切、余切、正割、余割。

·θ的正弦是对边与斜边的比值:sinθ=a/h

·θ的余弦是邻边与斜边的比值:cosθ=b/h

·θ的正切是对边与邻边的比值:tanθ=a/b

·θ的余切是邻边与对边的比值:cotθ=b/a

·θ的正割是斜边与邻边的比值:secθ=h/b

·θ的余割是斜边与对边的比值:cscθ=h/a

三角函数的特殊值。

用R语言实现三角基本函数计算,包括正弦、余弦、正切。> sin(0);sin(1);sin(pi/2) # 正弦[1] 0[1] 0.841471[1] 1> cos(0);cos(1);cos(pi) # 余弦[1] 1[1] 0.5403023[1] -1> tan(0);tan(1);tan(pi) # 正切[1] 0[1] 1.557408[1] -1.224647e-16

接下来,我们用ggplot2包来画出三角函数的图形。> library(ggplot2) # 加载ggplot2的库> library(scales)

三角函数画图,以下代码生成三角函数曲线,如图1-4所示。> x<-seq(-2*pi,2*pi,by=0.01) # x坐标> s1<-data.frame(x,y=sin(x),type=rep('sin',length(x))) # y坐标,正弦> s2<-data.frame(x,y=cos(x),type=rep('cos',length(x))) # y坐标,余弦> s3<-data.frame(x,y=tan(x),type=rep('tan',length(x))) # y坐标,正切> s4<-data.frame(x,y=1/tan(x),type=rep('cot',length(x))) # y坐标,余切> s5<-data.frame(x,y=1/cos(x),type=rep('sec',length(x))) # y坐标,正割> s6<-data.frame(x,y=1/sin(x),type=rep('csc',length(x))) # y坐标,余割> df<-rbind(s1,s2,s3,s4,s5,s6)> g<-ggplot(df,aes(x,y)) # 用ggplot2画图> g<-g+geom_line(aes(colour=type,stat='identity'))> g<-g+scale_y_continuous(limits=c(-2, 2))> g<-g+scale_x_continuous(breaks=seq(-2*pi,2*pi,by=pi),labels=c("-2*pi", "-pi","0","pi","2*pi"))> g图1-4 三角函数曲线

2.反三角函数

基本的反三角函数定义如下。

用R语言实现反三角函数的计算,包括反正弦、反余弦、反正切。> asin(0);asin(1) # 反正弦asin[1] 0[1] 1.570796 # pi/2=1.570796> acos(0);acos(1) # 反余弦acos[1] 1.570796 # pi/2=1.570796[1] 0> atan(0);atan(1) # 反正切atan[1] 0[1] 0.7853982 # pi/4=0.7853982

反三角函数画图,以下代码生成反三角函数曲线,如图1-5所示。> x<-seq(-1,1,by=0.005) # x坐标> s1<-data.frame(x,y=asin(x),type=rep('arcsin',length(x))) # y坐标,反正弦> s2<-data.frame(x,y=acos(x),type=rep('arccos',length(x))) # y坐标,反余弦> s3<-data.frame(x,y=atan(x),type=rep('arctan',length(x))) # y坐标,反正切> s4<-data.frame(x,y=1/atan(x),type=rep('arccot',length(x))) # y坐标,反余弦> s5<-data.frame(x,y=1/asin(x),type=rep('arcsec',length(x))) # y坐标,反正割> s6<-data.frame(x,y=1/acos(x),type=rep('arccsc',length(x))) # y坐标,反余弦> df<-rbind(s1,s2,s3,s4,s5,s6)> g<-ggplot(df,aes(x,y)) # 用ggplot2画图> g<-g+geom_line(aes(colour=type,stat='identity'))> g<-g+scale_y_continuous(limits=c(-2*pi,2*pi),breaks=seq(-2*pi,2*pi,by=pi), labels=c("-2*pi","-pi","0","pi","2*pi"))> g图1-5 反三角函数曲线

3.三角函数公式

接下来,用单元测试的方式来描述三角函数的数学公式,公式的左边等于公式的右边。通过testthat包进行单元测试,关于testthat包的安装和使用,请参考5.2节。

使用expect_that(right,left)函数,把公式的左右两边表达式,分别以参数形式传入函数中。运行expect_that()函数,如果没有返回结果则表示两个参数相等,如果有输出则根据输出查看原因。> library(testthat) # 加载testthat包> a<-5;b<-10 # 定义变量

平方和公式:> sin(a)^2+cos(a)^2[1] 1> expect_that(1, equals(sin(a)^2+cos(a)^2)) # 用单元测试的方法,判断公式是否两边相等> expect_that(2, equals(sin(a)^2+cos(a)^2)) # 如果公式两边不相等,会有错误提示Error: 2 not equal to sin(a)^2 + cos(a)^2Mean relative difference: 1

和角公式:

和角公式的单元测试如下:> expect_that(sin(a)*cos(b)+sin(b)*cos(a),equals(sin(a+b)))> expect_that(sin(a)*cos(b)-sin(b)*cos(a),equals(sin(a-b)))> expect_that(cos(a)*cos(b)-sin(b)*sin(a),equals(cos(a+b)))> expect_that(cos(a)*cos(b)+sin(b)*sin(a),equals(cos(a-b)))> expect_that((tan(a)+tan(b))/(1-tan(a)*tan(b)),equals(tan(a+b)))> expect_that((tan(a)-tan(b))/(1+tan(a)*tan(b)),equals(tan(a-b)))

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载