最近遇到很多程序员想转行到数据分析,于是就开始学习R语言。总以为有了其他语言的编程背景,学习R语言就是一件很简单的事情,一味地追求速度,但不求甚解,有些同学说2周就能掌握R语言,但掌握的仅仅是R语言的语法,其实这只能算是入门。
R语言的知识体系并非语法这么简单,如果都不了R的全貌,何谈学好R语言呢。本文将展示介绍R语言的知识体系结构,并告诉大家如何才能高效地学习R语言。
目录
-
R的知识体系结构
-
R语言学习
1. R的知识体系结构
R语言是一门统计语言,主要用于数学建模、统计计算、数据处理、可视化 等几个方向,R语言天生就不同于其他的编程语言。R语言封装了各种基础学科的计算函数,我们在R语言编程的过程中只需要调用这些计算函数,就可以构建出面向不同领域、不同业务的、复杂的数学模型。掌握R语言的语法,仅仅是学习R语言的第一步,要学好R语言,需要你要具备基础学科能力(初等数学,高等数学,线性代数,离散数学,概率论,统计学) + 业务知识(金融,生物,互联网) + IT技术(R语法,R包,数据库,算法) 的结合。所以把眼光放长点,只有把自己的综合知识水平提升,你才真正地学好R语言。换句话说,一旦你学成了R语言,你将是不可被替代的。
1.1 R的知识体系结构概览
R的知识体系结构是复杂的,要想学好R,就必须把多学科的知识综合运用,所以最大的难点不在于语言本身,而在于使用者的知识基础和综合运用的能力。
首先,从宏观上让我们先看一下R的知识体系结构的全貌,然后再分别解释每个部分的细节。
注:此图仅仅是我对R语言的理解,不排除由于个人阅历有限,观点片面的问题。
图中我将R语言知识体系结构分为3个部分:IT技术 + 业务知识 + 基础学科。
-
IT技术:是计算时代必备的技术之一,R语言就是一种我们应该要掌握技术。
-
业务知识:是市场经验和法则,不管你在什么公司,都会有自己的产品、销售、市场等,你要了解你的公司产品有什么,客户是谁,怎么才能把产品卖给你的客户。
-
基础学科:是我们这十几年在学校学的理论知识,当初学的时候并不知道是为了什么,毕业后如果你还能掌握一些知识并实际运用,那么这将是你最有价值的竞争力。
每个部分知识单独看都有其局限性,但如果能把知识两两结合起来,就构成了我们现在社会的各种技术创新点。
当然,R语言只是一门计算机语言技术,不能独自承担改写历史的重任,但R语言确实给了我们很大的想像空间,让我们能动手去了解这个世界的规律,找到无穷无尽的交叉点,创造出新的帝国。
如果你和我一样,都能站在这个角度来学习和使用R语言,那么我们一定可以成为并肩向前的同路人。欢迎加入我的团队,我们正在努力改变着未来。
1.2 R语言基础的知识
蓝图总是宏大和美好的,具体落实也将是困难重重的。接下来,我将会梳理思路,把所有的知识点对应到可操作的文档上,希望帮助大家掌握R语言的全貌!
R语言基础的知识,包括R语言的语法,R语言核心包的使用,R语言的内核编程,R语言包的开发,以及R语言的虚拟机。
1.2.1 R语言的语法
语法是我们了解R语言的第一步,和所有人一样,我也在很短的时间就适应R的语法规则,数据结构,基本类型,常用函数等等。但其实R的语法上坑,远比你知道的多得多。
我举个例子,看谁能准确的回答。比如,最基础的符号操作 “=”,”
1.2.2 R语言核心包的使用
R语言同其他语言一样,在软件启动时,为我们提供了7个核心包,包括了众多的基础函数,如 数学计算函数,统计计算函数,日期函数,包加载函数,数据处理函数,函数操作函数,图形设备函数等。通过search()函数,可以查看到R启动时默认加载7个核心包
。
> search()
[1] ".GlobalEnv" "package:stats" "package:graphics"
[4] "package:grDevices" "package:utils" "package:datasets"
[7] "package:methods" "Autoloads" "package:base"
这7个核心包,就是我们构建复杂模型的基础。由于这几个核心包比较底层,很多函数都是用C语言封装的没有R的源代码,而且除了官方文档,几乎没有其他更详细的文档介绍,所以这几个核心包就是学习的门槛,不要觉得某些函数会用了就行了,背后还有更深一层意义。
再问个问题,R的所有操作都是函数操作,那么“a
> a1:10;a
[1] 1 2 3 4 5 6 7 8 9 10
答案是,"1:10"对应"seq()","
> 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语言的世界里。
1.2.3 R语言的内核编程
R语言的内核编程,又是一个比较复杂的计算机学科的问题。R的内核编程应该包括哪些内容呢,除了刚才说的R的语法和R的核心包,还有面向对象编程,向量化计算,特殊数据类型,环境空间等。我的第二本书《R的极客理想-高级开发篇》将会重点介绍这部分的内容。
面向对象编程,是一种对现实世界理解和抽象的方法,主要用于解决复杂问题的设计及实现。在Java的世界里,从2003年开始我接触Java的时候,社区就已经在聊面向对象的程序设计了。对于R语言来说,直到2010年发布的2.12版本,才最终有了RC类型的面向对象实现。面向对象的成熟,标志着R已经具备了构建复杂大型应用的能力,但如何真正地把面向对象用好,似乎也并不是统计人擅长的。有能力写出像Hadley Wickham面向对象代码的人,在R的圈子里,实在是极少数的。
向量化计算,是R语言特有的一种并行计算方式。在R中,向量是R的基本数据类型(vector),当你对一个向量进行操作时,程序会对向量中每个元素进行分别计算,计算结果以向量的形式返回。比如,最常见的两个等长的向量相加。
> 1:10+10:1
[1] 11 11 11 11 11 11 11 11 11 11
向量化计算,在R中有很广泛的应用场景,基本可以取代循环计算,高效的完成计算任务。我们定义两个向量,先相加再求和,run1()函数用向量化计算实现,run2()用循环方法实现。
> a1:100000
> b100000:1
> run1# 向量化计算
+ sum(as.numeric(a+b))
+ }
> run2# 循环计算
+ c20
+ for(i in 1:length(a)){
+ c2+ }
+ c2
+ }
> system.time(run1())
用户 系统 流逝
0 0 0
> system.time(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())
[1] "sum"
R语言内核编程,如同其他语言一样,有很多的知识细节,并不是只有我提到的这几点。但由于缺少文档,同时R核心技术的不普及,所以知道的人就不多,会用的人更少。我也在每天探索,期待发现更多的秘密。
1.2.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包。嘿嘿!!
1.2.5 R语言的虚拟机
终于到我不熟悉话题了,已我3年多R语言使用经验来说,还碰不到R语言的虚拟机。不过,网上看到很多高手在生产环境都会重新编译R软件,比如 用OpenBLAS加速R的矩阵运算,在虚拟机层实现矩阵的并行化计算,也有用GPU实现矩阵并行计算的;还有牛人把R实现的各种算法,都用C++重新实现,然后通过Rcpp封装,直接与R的虚拟机进行连接调用。
我看着各种大神走远不送了,希望他们把虚拟机优化好了,免费发布个补丁包什么的。
1.3 R语言的第三方包
R语言的第三方包,主要包括了在CRAN上的5000多个第三方包,以及其他社区的R包,这些包在各种领域中都发挥着重要的作用。在《
R的极客理想-工具篇
》一书中,我介绍了30多个包的使用,包括 时间序列包(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, PerformanceAnalytics, TTR, sde, YieldCurve), 风险管理(parma, evd, evdbayes, evir, extRemes, ismev) 等。同时,我正在量化投资的创业中,R语言作为是系统架构中的算法引擎在最核心的位置,R正在承担着最有价值的业务,在后续的《
R的极客理想-量化投资篇
》一书中,我将会完整的介绍R语言在我的量化投资系统中的运用。
1.4 数学的基础知识
数学的基础知识,主要包括初等数学,高等数学,线性代数,概率论,统计学等。我们曾在大学中学过的各种数学,那些不知道有什么用,只为考试而学的数学,是能真正决定R语言掌握深度的基础知识。
当R语言普及以后,变成大众话的编程语言,入门会越来越容易,第三方包的调用会越来越简单,最后就是拼基础学科功底了,数学就是对所有人来说最难的基础学科。
-
初等数学,中国人一直都在强调数学是我们的优势,比老外强很多,其实强的部分仅限于初等数学,加法口诀和乘法口诀让我们可以口算100以内的四则运算。
-
高等数学,大学里挂科最多的一门课,那种照本宣科的教学方法,完全不知所谓。至到遇到了R,我才恍悟 为什么最小二乘法能进行最优化的计算。重新捡起高数,是学R的必经之路。
-
线性代数,直到读完了Google的PageRank论文的N年后,自己才想明白,原来矩阵可以处理海量数据的计算,实现分步式算法与单机算法的一致性。
-
概率论,通过R语言进行各种分步的随机实验,并利用概率密度曲线函数应用到实际的业务中,才让我理解概率才是可以衡量客观事件发生的指标。
-
统计学,通过R语言我们可以很简单的构建各种统计模型,利用Bayes分别器判断垃圾邮件,利用回归模型预测未来的房价。
是R语言能让我切身地感受到,数学的基础知识在我们实际生活中的运用;也是R语言拉近了学术界和工业界的距离。如果能把我们从小到大学到的知识串起来,我想每个人都会具备与众不同的知识结构,将会在各行各业实现伟大的创新。
1.5 业务知识
业务知识涉及的面非常广,每个人都应该具备自身所处行业的知识,并结合R语言擅长的领域,发现新的机会。R语言擅长的领域包括 统计分析、金融分析、数据挖掘、互联网、生物信息学、生物制药、全球地理科学、数据可视化等。
我在软件和互联网行业呆了8年,亲身经历了两个行业的高速发展和变迁。技术一波又一波,每年都有新的主题,一路跟下来的人越来越少,虽然新鲜的血液不断补充着,但能力和经验却远达不到要求,被市场的浮躁扰动着。近些年,中国的创业公司的成功,少有技术创新,大都是商业模式创新和资本运作的成功。
面对着中国资本市场,掌握好业务的知识,就是找到了赚钱的法宝。当业务成熟,在大家都懂得游戏规则后,竞争就会变得异常激烈了,像电商,团购,旅游,酒店,游戏 都是如此。新领域新业务,才是值得80后90后年轻人奋斗的方向。如火如荼的O2O、互联网金融、物联网、机器人,也许正是明年的爆发点。如果你又懂技术又懂业务,学习又好,你将是下一个帝国的创造者。
1.6 跨学科的综合运用能力
再次强调,只要把多种学科的知识综合运用,不仅成为R语言的一代高手,更能实现自我的价值。