最近遇到很多的程序員都想轉行到數據分析,于是就開始學習R語言??傄詾橛辛似渌Z言的編程背景,學習R語言就是一件很簡單的事情,一味地追求速度,但不求甚解,有些同學說2周就能掌握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技術 + 業務知識 + 基礎學科。
每個部分知識單獨看都有其局限性,但如果能把知識兩兩結合起來,就構成了我們現在社會的各種技術創新點。
當然,R語言只是一門計算機語言技術,不能獨自承擔改寫歷史的重任,但R語言確實給了我們很大的想像空間,讓我們能動手去了解這個世界的規律,找到無窮無盡的交叉點,創造出新的帝國。
如果你和我一樣,都能站在這個角度來學習和使用R語言,那么我們一定可以成為并肩向前的同路人。歡迎加入我的團隊,我們正在努力改變著未來。
R語言在線培訓地址:
1.2 R語言基礎的知識
藍圖總是宏大和美好的,具體落實也將是困難重重的。接下來,我將會梳理思路,把所有的知識點對應到可操作的文檔上,希望幫助大家掌握R語言的全貌!
R語言基礎的知識 ,包括R語言的語法,R語言核心包的使用,R語言的內核編程,R語言包的開發,以及R語言的虛擬機。
1.2.1 R語言的語法
語法是我們了解R語言的第一步,和所有人一樣,我也在很短的時間就適應R的語法規則,數據結構,基本類型,常用函數等等。但其實R的語法上坑,遠比你知道的多得多。
我舉個例子,看誰能準確的回答。比如,最基礎的符號操作 “=”、“
R語言是函數式語言,語法自由,命名自由,使用簡單,這只是對于普通用戶來說的。作為一個有理想的極客,怎么能只停留在語法上呢!R是完全面向對象的,你了解什么是面向對象嗎?R的面向對象打破了R原有的自由,但又要兼容原有的自由語法,多么糾結的設計啊,你能體會到嗎?并不是記住了R的語法,就代表掌握了R語言。里面種各坑,只有自己踩了,再自己爬出來,才是真正的成長。
1.2.2 R語言核心包的使用
R語言同其他語言一樣,在軟件啟動時,為我們提供了7個核心包,包括了眾多的基礎函數,如 數學計算函數,統計計算函數,日期函數,包加載函數,數據處理函數,函數操作函數,圖形設備函數等。通過()函數,可以查看到R啟動時默認加載7個核心包。
掌握這種對應關系的意義在于,因為R是解釋型語言,我們可以通過傳遞一個函數A的句柄,讓其他的函數B動態調用這個函數A,這就是動態語言中的閉包特性的使用思路。在中,已經被廣泛使用了,但在R語言中,卻只有核心包的一些函數在使用這種語法。在R語言中,這種需要有計算機背景知識的地方還有很多,特別是在考慮如何提升R性能的部分。所以,不要太輕易就說自己掌握了R語言,多想想如何才能把其他語言的基礎帶到R語言的世界里。
1.2.3 R語言的內核編程
R語言的內核編程,又是一個比較復雜的計算機學科的問題。R的內核編程應該包括哪些內容呢,除了剛才說的R的語法和R的核心包,還有面向對象編程,量向化計算,特殊數據類型,環境空間等。我的第二本書《R的極客理想-高級開發篇》將會重點介紹這部分的內容。
面向對象編程,是一種對現實世界理解和抽象的方法,主要用于解決復雜問題的設計及實現。在Java的世界里,從2003年開始我接觸Java的時候,社區就已經在聊面向對象的程序設計了。對于R語言來說,直到2011年發布的2.14版本,才最終有了RC類型的面向對象實現。面向對象的成熟,標志著R已經具備了構建復雜大型應用的能力,但如何真正地把面向對象用好,似乎也并不是統計人擅長的。有能力寫出像 面向對象代碼的人,在R的圈子里,實在是極少數的。
量向化計算,是R語言特有的一種并行計算方式。在R中,向量是R的基本數據類型(),當你對一個向量進行操作時,程序會對向量中每個元素進行分別計算,計算結果以向量的形式返回。比如,最常見的兩個等長的向量相加。
量向化計算,是R語言特有的一種并行計算方式。在R中,向量是R的基本數據類型(),當你對一個向量進行操作時,程序會對向量中每個元素進行分別計算,計算結果以向量的形式返回。比如,最常見的兩個等長的向量相加。
通過運行程序,我們可以清楚地看出,向量化計算要比循環快。當算法越復雜數據量越大的時候,計算的時間差距會越明顯的。R的編程中的一條法則就是用向量計算代替所有的循環計算。
特殊數據類型,R語言中除了那些基本的數據類型,還有一些高級的數據類型,并不是不常用,而是你不知道。
S3類型,S4類型,RC類型分別對應R語言支持的三種面向對象編程的數據結構
環境類型(),由內核定義的一個數據結構,由一系列的、有層次關系的框架(frame)組成,每個環境對應一個框架,用來區別不同的運行時空間(scope)
可能還有我不知道的類型…(請發現的同學通知我!)
環境空間,在進行R包開發時,是必備的一個知識點。每個環境空間都是環境類型的一個實例。每個R包都會被加載到一個環境空間中,形成有層次關系的、可調用的空間結構。
我們定義的函數和變量,都會存在于R的環境空間中,通過ls()就可以看到當前環境空間中的這些變量,比如,剛才量向化計算定義的變量和函數。
除了我們自己定義的變量和函數,環境空間中還有很多其他的變量和函數,比如sum(), (), .time()等,這些函數我們可以直接使用,但是它們并不在當前環境空間中,所以直接用ls()是查看不到的。當我們切換到base的環境空間時,就可以找到sum()的函數定義了。
R語言內核編程,如同其他語言一樣,有很多的知識細節,并不是只有我提到的這幾點。但由于缺少文檔,同時R核心技術的不普及,所以知道的人就不多,會用的人更少。我也在每天探索,期待發現更多的秘密。
R語言在線培訓地址:
1.2.4 R語言包的開發
R包的開發,是R語言編程中比較難的,又不得不面對的問題,不僅要把上文中所提到的各種R語言技術綜合運用在一起,還要符合R包的開發規范,并用Latex寫好文檔,最后提交給CRAN發布。技術問題雖然難,花時間還是可以解決的,但想要在CRAN上發布,那就只能用“難于上青天”來形容了。R語言發展了20多年,只有5000多個包在CRAN上發布,審核不是一般嚴格??!我寫的游戲包和天氣包,改了很多次,都沒能通過,都到了要放棄的邊緣了。
換個角度想,只有審核嚴格才能保證用戶在安裝第三方的R包時候不會出錯。由于CRAN的審核過于嚴格, 也受不了了,又開發了包,不僅提供了簡化R包的開發的工具函數,還支持社區發布。這樣就可以脫離CRAN的束縛,以個人的名義發布各種奇思妙想的R包,甚至是“不誤正業”的R包。嘿嘿!!
1.2.5 R語言的虛擬機
終于到我不熟悉話題了,已我3年多R語言使用經驗來說,還碰不到R語言的虛擬機。不過,網上看到很多高手在生產環境都會重新編譯R軟件,比如 用加速R的矩陣運算,在虛擬機層實現矩陣的并行化計算,也有用GPU實現矩陣并行計算的;還有牛人把R實現的各種算法,都用C++重新實現,然后通過Rcpp封裝,直接與R的虛擬機進行連接調用。
我看著各種大神走遠不送了,希望他們把虛擬機優化好了,免費發布個補丁包什么的。
1.3 R語言的第三方包
R語言的第三方包,主要包括了在CRAN上的5000多個第三方包,以及其他社區的R包,這些包在各種領域中都發揮著重要的作用。在《R的極客理想-工具篇》一書中,我介紹了30多個包的使用,包括 時間序列包(zoo、xts、),性能監控包(、profr、),R跨平臺通信包(、、rJava), R服務器包(、、、),數據庫訪問包(、、、、RHive)、操作包(rhdfs、rmr2、)等。
還有很多常用的包,比如 數據處理包(、plyr、、、、mcmc),機器學習包(nnet、rpart、tree、party、lars、boost、e1071、、gafit、),可視化包(、、),地圖包(ggmap、、) 等。
R語言對于金融也有很好的支持,時間序列包(zoo、xts、chron、its、)、金融分析(、、、、TTR、sde、)、風險管理(parma、evd、、evir、、ismev) 等。同時,我正在量化投資的創業中,R語言作為是系統架構中的算法引擎在最核心的位置,R正在承擔著最有價值的業務,在后續的《R的極客理想-量化投資篇》一書中,我將會完整的介紹R語言在我的量化投資系統中的運用。
1.4 數學的基礎知識
數學的基礎知識,主要包括初等數學,高等數學,線性代數,概率論,統計學等。我們曾在大學中學過的各種數學,那些不知道有什么用,只為考試而學的數學,是能真正決定R語言掌握深度的基礎知識。
當R語言普及以后,變成大眾話的編程語言,入門會越來越容易,第三方包的調用會越來越簡單,最后就是拼基礎學科功底了,數學就是對所有人來說最難的基礎學科。
是R語言能讓我切身地感受到,數學的基礎知識在我們實際生活中的運用;也是R語言拉近了學術界和工業界的距離。如果能把我們從小到大學到的知識串起來,我想每個人都會具備與眾不同的知識結構,將會在各行各業實現偉大的創新。
1.5 業務知識
業務知識涉及的面非常廣,每個人都應該具備自身所處行業的知識,并結合R語言擅長的領域,發現新的機會。R語言擅長的領域包括 統計分析、金融分析、數據挖掘、互聯網、生物信息學、生物制藥、全球地理科學、數據可視化等。
我在軟件和互聯網行業呆了8年,親身經歷了兩個行業的高速發展和變遷。技術一波又一波,每年都有新的主題,一路跟下來的人越來越少,雖然新鮮的血液不斷補充著,但能力和經驗卻遠達不到要求,被市場的浮躁擾動著。近些年,中國的創業公司的成功,少有技術創新,大都是商業模式創新和資本運作的成功。
面對著中國資本市場,掌握好業務的知識,就是找到了賺錢的法寶。當業務成熟,在大家都懂得游戲規則后,競爭就會變得異常激烈了,像電商,團購,旅游,酒店,游戲 都是如此。新領域新業務,才是值得80后90后年輕人奮斗的方向。如火如荼的O2O、互聯網金融、物聯網、機器人,也許正是明年的爆發點。如果你又懂技術又懂業務,學習又好,你將是下一個帝國的創造者。
1.6 跨學科的綜合運用能力
再次強調,只要把多種學科的知識綜合運用,不僅成為R語言的一代高手,更能實現自我的價值。
R語言可以從IT的角度,幫助你實現成功,同時你的成功也將是R語言的成功!
R語言在線培訓地址:
2. R語言學習
花了很大的篇幅,終于把我理解的R語言知識體系解釋清楚了,寫著寫著都快跑題了。那么接下來,我們應該如何高效的學習R語言呢?有句話要說在前頭,學習是艱苦的,沒有捷徑可言,如果你想成功,那么更要面對苦中之苦。正確的學習方法,可以讓我們少走彎路,學習別人的經驗,會讓我們加速成長。
通過上文中對跨學科知識體系的描述,我想大家都應該明白了,要想學好R,最大的難點不在于語言本身,而在于使用者的知識基礎和綜合運用的能力。當然,綜合運用是要以良好的基礎知識為前提的,先拋開業務知識和基礎學科的知識不說,只談IT技術,應該要掌握哪些知識呢?
2.1 IT基礎知識
對于R語言本身來說,我們需要掌握R語言基礎的知識,包括R的語法,R核心包的使用,R的內核編程,R包的開發,以及業務相關R的第三方包的使用。
如果你在學習R語言之前,已經有了很多的Java, 等編程語言的經驗,那么這將幫助你能很快熟悉R語言,你需要再補充一些數據分析和數據挖掘算法的知識,就能馬上用在實際的工作中了。
如果你之前是SAS或數據科學家,那你只需要熟悉R的編程語法和第三方R包,就能用R來完成SAS和的所有任務。
如果是BI程序員,平時工作經常有處理數據和可視化的任務,那么你可以邊學R邊補充一些統計的知識,從無味ETL過程中發現數據的價值。
如果你是一名在讀的統計學生,R語言將幫助你把書本上枯燥知識程序化,在學習過程中,就能發現社會的規律
如果你一直在用Excel并抱怨功能遠遠不夠的時候,試一下R語言,你的想法很快就會變成你財富的源泉。
如果你是一名寬客(Quant),還不懂R語言的話,那么你很快就會被市場淘汰的。
如果你是一名算法工程師,用Java寫一個MR算法通常要好幾千行,你可試試用,十分之一的代碼行就可以完成同樣的事情。…
R語言可以與各種技術、各種思路相結合,讓R語言和你已掌握的知識進行碰撞,你就會變得和別人不一樣。
2.2 R語言中文圖書
記得 鄧一碩 寫過一篇”R語言書籍的學習路線圖“的文章,很有參考意義。文章分別介紹了R語言的初級入門、高級入門、繪圖與可視化、計量經濟學、時間序列分析和金融等內容,涉及到30多本R語言圖書和小冊子,但大部分是英文的。
隨著時間的推移,這兩年R語言又增加了好多本新書,中文圖書也慢慢地多了起來。對于不同層次的R語言用戶,也有了市場細分。入門的朋友可以從《R語言編程藝術》開始學習;有一定R的基礎的朋友可以閱讀《R語言實戰》;需要擴展知識面的朋友可以閱讀《R的極客理想-工具篇》;在掌握了各種R的入門技術后,高級的R語言開發者可以閱讀《R的極客理想-高級開發篇》(即將出版);用R做可視化的朋友,可以閱讀《:數據分析與圖形藝術》;正在學習統計學的朋友,可以閱讀《統計建模與R軟件》;準備用R做金融的朋友,可以閱讀《時間序列分析及應用(R語言)原書第2版》和《金融數據分析導論(基于R語言)》。
以上推薦的圖書,筆者都親自讀過,予以品質保證。此圖書列表將不定期更新,把我讀到的好書分享給大家!
2.3 R語言中文社區
除了圖書,中文的R語言社區和個人博客也在蓬勃發展。
2.4 R語言中文博客
最后,祝大家把R語言學好用好,在各自的領域中找到創新的突破口,實現自我價值,然后反饋給R語言社區,加速R的壯大發展。
3. 作者介紹
張丹,程序員、架構師,創業者。我的博客: 。個人著作:《R的極客理想》系列圖書。
從程序員開始,到架構師一路走來,經歷過太多的系統和應用。做過手機游戲,寫過編程工具;做過大型Web應用系統,寫過公司內部CRM;做過SOA的系統集成,寫過基于的大數據工具;做過外包,做過電商,做過團購,做過支付,做過SNS,也做過移動SNS。以前只用Java,然后學了PHP,現在用R和Node。最后跳出IT圈,進入金融圈,研發量化交易軟件。