R語言知識體系概覽

jopen 8年前發布 | 48K 次閱讀

R語言知識體系概覽

R的極客理想系列文章,涵蓋了R的思想,使用,工具,創新等的一系列要點,以我個人的學習和體驗去詮釋R的強大。

R語言作為統計學一門語言,一直在小眾領域閃耀著光芒。直到大數據的爆發,R語言變成了一門炙手可熱的數據分析的利器。隨著越來越多的工程背景的人的加入,R語言的社區在迅速擴大成長。現在已不僅僅是統計領域,教育,銀行,電商,互聯網….都在使用R語言。

要成為有理想的極客,我們不能停留在語法上,要掌握牢固的數學,概率,統計知識,同時還要有創新精神,把R語言發揮到各個領域。讓我們一起動起來吧,開始R的極客理想。

關于作者:

  • 張丹(Conan), 程序員Java,R,PHP,Javascript

  • weibo:@Conan_Z

  • blog: http://blog.fens.me

  • email: bsspirit@gmail.com

轉載請注明出處:
http://blog.fens.me/r-overview/

前言

最近遇到很多的程序員都想轉行到數據分析,于是就開始學習R語言。總以為有了其他語言的編程背景,學習R語言就是一件很簡單的事情,一味地追求速度,但不求甚解,有些同學說2周就能掌握R語言,但掌握的僅僅是R語言的語法,其實這只能算是入門。

R語言的知識體系并非語法這么簡單,如果都不了R的全貌,何談學好R語言呢。本文將展示介紹R語言的知識體系結構,并告訴讀者如何才能高效地學習R語言。

目錄

  1. R的知識體系結構

  2. R語言學習

1. R的知識體系結構

R語言是一門統計語言,主要用于數學建模、統計計算、數據處理、可視化 等幾個方向,R語言天生就不同于其他的編程語言。R語言封裝了各種基礎學科的計算函數,我們在R語言編程的過程中只需要調用這些計算函數,就可以構建出面 向不同領域、不同業務的、復雜的數學模型。掌握R語言的語法,僅僅是學習R語言的第一步,要學好R語言,需要你要具備基礎學科能力(初等數學,高等數學, 線性代數,離散數學,概率論,統計學) + 業務知識(金融,生物,互聯網) + IT技術(R語法,R包,數據庫,算法) 的結合。所以把眼光放長點,只有把自己的綜合知識水平提升,你才真正地學好R語言。換句話說,一旦你學成了R語言,你將是不可被替代的。

1.1 R的知識體系結構概覽

R的知識體系結構是復雜的,要想學好R,就必須把多學科的知識綜合運用,所以最大的難點不在于語言本身,而在于使用者的知識基礎和綜合運用的能力。

首先,從宏觀上讓我們先看一下R的知識體系結構的全貌,然后再分別解釋每個部分的細節。

rbase

注:此圖僅僅是我對R語言的理解,不排除由于個人閱歷有限,觀點片面的問題。

圖中我將R語言知識體系結構分為3個部分:IT技術 + 業務知識 + 基礎學科。

  • IT技術:是計算時代必備的技術之一,R語言就是一種我們應該要掌握技術。

  • 業務知識:是市場經驗和法則,不管你在什么公司,都會有自己的產品、銷售、市場等,你要了解你的公司產品有什么,客戶是誰,怎么才能把產品賣給你的客戶。

  • 基礎學科:是我們這十幾年在學校學的理論知識,當初學的時候并不知道是為了什么,畢業后如果你還能掌握一些知識并實際運用,那么這將是你最有價值的競爭力。

每個部分知識單獨看都有其局限性,但如果能把知識兩兩結合起來,就構成了我們現在社會的各種技術創新點。

  • IT技術+業務知識:創造了阿里巴巴的電子商務帝國,騰訊全生態鏈的社交網絡。

  • IT技術+基礎學科:創造了Google搜索的神話,華爾街金融不敗的帝國。

當然,R語言只是一門計算機語言技術,不能獨自承擔改寫歷史的重任,但R語言確實給了我們很大的想像空間,讓我們能動手去了解這個世界的規律,找到無窮無盡的交叉點,創造出新的帝國。

如果你和我一樣,都能站在這個角度來學習和使用R語言,那么我們一定可以成為并肩向前的同路人。歡迎加入我的團隊,我們正在努力改變著未來。

1.2 R語言基礎的知識

藍圖總是宏大和美好的,具體落實也將是困難重重的。接下來,我將會梳理思路,把所有的知識點對應到可操作的文檔上,希望幫助大家掌握R語言的全貌!

R語言基礎的知識,包括R語言的語法,R語言核心包的使用,R語言的內核編程,R語言包的開發,以及R語言的虛擬機。

1.2.1 R語言的語法

語法是我們了解R語言的第一步,和所有人一樣,我也在很短的時間就適應R的語法規則,數據結構,基本類型,常用函數等等。但其實R的語法上坑,遠比你知道的多得多。

我舉個例子,看誰能準確的回答。比如,最基礎的符號操作 “=”,”<-","<<-" ,三者有什么區別,分別在什么時候用?不要偷偷說問題太偏了,實際根本用不到。我的代碼里處處都在用這3個符號,只是你不知道而已。在學習R的時候,不要 用已經掌握的C, Java, Python的經驗直接去套R的語法,掉坑里的就是這些人。要重頭開始學,一路上沒有捷徑。 R語言是函數式語言,語法自由,命名自由,使用簡單,這只是對于普通用戶來說的。作為一個有理想的極客,怎么能只停留在語法上呢!R是完全面向對象的,你 了解什么是面向對象嗎?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<-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語言的世界里。

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()用循環方法實現。

> 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())
用戶 系統 流逝 
   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語言的一代高手,更能實現自我的價值。

  • 當IT技術與業務知識完美結合,你會在新興的市場的找到機會。一旦市場成熟后,業務競爭就會變成資本競爭,機會將不復存在。

  • 當IT技術與基礎學科相結合,你可以通過科技創新,建立技術壁壘,保持技術優勢直到成為行業老大。

  • 當IT技術、業務知識、基礎學科,三者同時具備時,那么你將是不可被替代的。只要找到屬于你的團隊,研發出自己的產品,推廣給你的用戶,你就已經成功了!

R語言可以從IT的角度,幫助你實現成功,同時你的成功也將是R語言的成功!

2. R語言學習

花了很大的篇幅,終于把我理解的R語言知識體系解釋清楚了,寫著寫著都快跑題了。那么接下來,我們應該如何高效的學習R語言呢?有句話要說在前頭, 學習是艱苦的,沒有捷徑可言,如果你想成功,那么更要面對苦中之苦。正確的學習方法,可以讓我們少走彎路,學習別人的經驗,會讓我們加速成長。

通過上文中對跨學科知識體系的描述,我想大家都應該明白了,要想學好R,最大的難點不在于語言本身,而在于使用者的知識基礎和綜合運用的能力。當然,綜合運用是要以良好的基礎知識為前提的,先拋開業務知識和基礎學科的知識不說,只談IT技術,應該要掌握哪些知識呢?

2.1 IT基礎知識

對于R語言本身來說,我們需要掌握R語言基礎的知識,包括R的語法,R核心包的使用,R的內核編程,R包的開發,以及業務相關R的第三方包的使用。

如果你在學習R語言之前,已經有了很多的Java, Python等編程語言的經驗,那么這將幫助你能很快熟悉R語言,你需要再補充一些數據分析和數據挖掘算法的知識,就能馬上用在實際的工作中了。

如果你之前是SAS或Matlab數據科學家,那你只需要熟悉R的編程語法和第三方R包,就能用R來完成SAS和Matlab的所有任務。

如果是BI程序員,平時工作經常有處理數據和可視化的任務,那么你可以邊學R邊補充一些統計的知識,從無味ETL過程中發現數據的價值。

如果你是一名在讀的統計學生,R語言將幫助你把書本上枯燥知識程序化,在學習過程中,就能發現社會的規律。

如果你一直在用Excel并抱怨功能遠遠不夠的時候,試一下R語言,你的想法很快就會變成你財富的源泉。

如果你是一名寬客(Quant),還不懂R語言的話,那么你很快就會被市場淘汰的。

如果你是一名Hadoop算法工程師,用Java寫一個MR算法通常要好幾千行,你可試試用RHadoop,十分之一的代碼行就可以完成同樣的事情。

...

R語言可以與各種技術、各種思路相結合,讓R語言和你已掌握的知識進行碰撞,你就會變得和別人不一樣。

2.2 R語言中文圖書

記得 鄧一碩 寫過一篇"R語言書籍的學習路線圖"的文章,很有參考意義。文章分別介紹了R語言的初級入門、高級入門、繪圖與可視化、計量經濟學、時間序列分析和金融等內容,涉及到30多本R語言圖書和小冊子,但大部分是英文的。

rbooks

隨著時間的推移,這兩年R語言又增加了好多本新書,中文圖書也慢慢地多了起來。對于不同層次的R語言用戶,也有了市場細分。入門的朋友可以從《R語言編程藝術》開始學習;有一定R的基礎的朋友可以閱讀《R語言實戰》;需要擴展知識面的朋友可以閱讀《R的極客理想-工具篇》;在掌握了各種R的入門技術后,高級的R語言開發者可以閱讀《R的極客理想-高級開發篇》(即將出版);用R做可視化的朋友,可以閱讀《ggplot2:數據分析與圖形藝術》;正在學習統計學的朋友,可以閱讀《統計建模與R軟件》;準備用R做金融的朋友,可以閱讀《時間序列分析及應用(R語言)原書第2版》《金融數據分析導論(基于R語言)》

以上推薦的圖書,筆者都親自讀過,予以品質保證。此圖書列表將不定期更新,把我讀到的好書分享給大家!

2.3 R語言中文社區

除了圖書,中文的R語言社區和個人博客也在蓬勃發展。

  • 統計之都,中國 大陸最權威的R語言組織,不僅積累了大量高質量的R語言文章,并主辦了七屆中國R語言會議。統計之都團隊成員,還參與翻譯了《R語言編程藝術》、《R語言 實戰》、《ggplot2:數據分析與圖形藝術》、《R語言核心技術手冊(第2版)》、《R數據可視化手冊》、《R語言統計入門(第2版)》等多本圖書。

  • 煉數成金論壇,以數據分析為主題,設有R語言板塊,提供在線的R語言入門培訓,黃志洪老師算法講解超一流。

  • 人大經濟論壇,以經管教育為主題,設有R語言板塊,以線下培訓為主。

2.4 R語言中文博客

最后,祝大家把R語言學好用好,在各自的領域中找到創新的突破口,實現自我價值,然后反饋給R語言社區,加速R的壯大發展。祝大家中秋節快樂。

注:本文將做為《R的極客理想-高級開發篇》一書的開篇文章。

######################################################
看文字不過癮,作者視頻講解,請訪問網站:http://onbook.me/video
######################################################

轉載請注明出處:
http://blog.fens.me/r-overview/

This entry was posted in R語言實踐


來自: http://blog.fens.me/r-overview/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!