该如何学习 R 语言?

背景金融小硕,想学习R语言却不知道应该如何学习,应该按何种步骤,看哪些书或者视频资料等东西,所以提问这个问题,希望知道学习R语言的一般过程是怎样的,谢…
关注者
7515
被浏览
428584
由于R语言主要是和统计、计量、数据挖掘等领域相互联系,因此核心是这些领域中的问题,R的任务就是帮助你花更多的精力在思考和解决这些问题,而不是做计算上或者技术上的底层架构,或者不断重造轮子,并且不丧失灵活性(可编程性)。因此,学习R可能并不像学习纯粹的一门编程语言一样,最好需要在这些问题的上下文中学习,脱离了数据科学的背景学习R,仿佛就是学习如何使用扳手,却根本不认识螺丝钉。

根据我自己的经验,学习R比较有效的过程基本上是:
  1. 看在线互动教程、打代码,了解R的最基本的东西,大概能做哪些事情(比如计算一些线性回归),自己根据这些教程去做各种变化,做许多实验,探索一下这个语言的基本语法和构造。
  2. 看一些入门书籍,比如 Introductory Time Series with R等等,给你展示怎样用R来比较完整地解决一个问题。可以根据你的领域选择类似的书籍。
  3. 开始用R解决一些统计、计量相关的计算性问题,比如用自己的数据跑一些模型,探索这些数据里面可能有趣的东西。
  4. 在数据较为复杂一些的项目中使用R,发现数据操作能力太弱,开始接触更深层的R概念,比如可以看 Data Manipulation With R (Phil Spector),形成更加系统的概念,逐渐掌握操作复杂一些的数据和对象的能力。
  5. 学习最流行的R扩展包的使用方法,发现整理数据和建模中的许多工作都大幅简化,工作效率出现质的提升。
  6. 逐渐开始做更为复杂的项目,形成一整套数据处理、建模的技术和技巧,形成较为系统、完整的认识和知识结构,有较强的社区检索能力,遇到问题能够自行解决或者通过社区解决。
  7. 阅读进阶的书籍,例如 Hadley 的 Advanced R Programming,对R的底层和开发有了更加深刻和全面的认识,形成了使用R的基本直觉。
  8. 参与到开源社区,不断跟进最新的发展和技术。
  9. 参与到R会议,结交更多的朋友,交流使用经验,进一步提升视野和能力。

=== 原答案 ===
R语言有很多国外的书籍,建议就你的研究领域或者工作领域来选择书籍。

假如你做的是时间序列分析,那么作为入门你就可以看《Introductory Time Series with R》,里面有很多生动的例子,数据也可以直接获取。把书里的例子和练习都做掉,每个例子用自己的数据去多做些实验,自己探索一下涉及到的函数还能做些别的什么,并且看看这些函数的文档。

此时对R已经有了初步的了解。如果做到一定程度,开始用于自己的项目,就会发现自己用R处理数据的能力很弱,一般表现为想把一种数据处理成另外一种样子,但是不知道如何实现。此时,需要补充一下用R整数据的基本方法,可以读《Data Manipulation With R - Phil Spector》,里面通俗易懂地介绍了R数据处理的基本观念和方法,让你大概知道R处理数据时是什么样的机制。这样你在写代码时就有更高的预见性,否则很容易出错。

接下来需要比较系统的应用,这就需要你把R作为主要的生产语言来完成你的项目,在此之前如果为了练手,如果你是研究者那么你应该找几篇你的研究领域的论文并用R复制出来,再次过程中你会修补很多缺漏和不熟悉的地方,也会对数据处理和分析建立起一些直觉。

之后就是不断地积累了。
(PS: 建议使用RStudio来做R开发,目前的Release Preview版本有了不错的调试能力,严重推荐)

最近的一篇英文文章谈了这个:Kun Ren - R: Getting Started

=== 2014-03-17 更新 ===
最近密集地用R做较为复杂一点的金融交易相关的项目,有很多资源值得大力推荐。
首先,如果想从 R user 成长为 R programmer,要走了路还是很长的,这不仅涉及到了R的基本应用,还涉及到用R语言作为主要语言开发较为复杂一点的项目。如果项目开发涉及到团队合作,并且希望项目能够实现代码重复利用、使用灵活、提升代码的运行效率、加快产品开发周期等等,那就不简单是学习R的问题了,还有许多工具需要使用,下面列出一些需要掌握的东西:

  • 版本控制系统 Git,面向团队开发可以将项目托管在GitHub或者Bitbucket㩐网站上
  • 一些编程本身方面的技能,例如函数式编程等等
  • 充分利用已有的成熟扩展包做一些较为复杂的数据操作和可视化,例如plyr做data.frame拆分——变换——整合, reshape2做long format和short format数据表之间的转换, data.table, lubridate, stringr, ggplot2等等
  • 掌握一定的数据库使用方法,例如用RSQLite扩展包操作简单易用的SQLite数据库
  • 程序调试(debugging),能够找到程序不完善的或者有错误的地方和比较根本地解决错误根源
  • 遇到问题能快速自己解决,解决不了或者认为解决方案不太好能够在stackoverflow上发现解决方案或者提出问题

根据 Hadley Wickham 的说法,R目前面临的一个主要挑战就是R的主要用户群都是业余使用者(R user),而不是专业开发人员(R programmer),这两者写出的项目从质量到运行效率、可扩展性、可重复性、开发周期、共享度都天差地别。如果希望自己的项目实现上述特性,你自己或者自己的团队必须能够升级到 R programmer的水平,一个要旨就是大量的使用、参与社区讨论,有问题多自己解决或者在社区寻求帮助,发现扩展包的问题直接去github或者其他社区提出issue或者直接fork项目提交改进方案。虽然使用R的人群中大部分不是专业的IT从业人员,而是研究者、金融领域相关人员,但是提升自己的技能到专业水平有诸多益处。有一定经验的使用者,建议读一下 Hadley Wickham 的 Welcome · Advanced R. 里面的全部文章,内有许多很有价值的东西,值得花时间思考的学习。


另外,我的博客(Kun Ren - Blog Posts)也在缓慢更新自己使用R的一些心得。


=== 2014-04-12 更新 ===

我在GitHub上写的一个帮助学习R的开源项目learnR (renkun-ken/learnR @ GitHub)最近一个月增加了大量内容,从初级到高级、常用扩展包、数据可视化等等。R最强大的地方是扩展包,例如stringr, reshape2, plyr, dplyr等等用来做数据操作速度很快很好用,比起R base提供的函数要方便得多,因此掌握一些流行的扩展包是非常有必要的。


最近做了一个模仿F# pipeline operator的R扩展包 pipeR(renkun-ken/pipeR @ GitHub),可以大幅简化流程化的数据操作,欢迎使用!


=== 2014-07-06 更新 ===

最近发布了一个新的扩展包 rlist

Editor: rlist:基于list在R中处理非关系型数据

renkun-ken/rlist @ GitHub