1. 程式人生 > >如何高效率學習R?[轉自微信:R語言中文社群]

如何高效率學習R?[轉自微信:R語言中文社群]

學R主要在於5點三階段:

第一階段有一點:

基礎的檔案操作(read.*, write.*)、資料結構知識,認識什麼是資料框(data.frame)、列表(list)、矩陣(matrix)、向量(vector),如何提取(包括which, []等)、置換(t, matrix等)、刪除(-, which等)、運算(+, -, *, / , %%, %/%等)、轉換(as.*)、修改(edit, fix等)資料(包括單個數、行、列、表、變數),安裝包、呼叫包以及session的儲存。完成這一階段,你就大致能像excel裡處理資料一樣了。

第二階段有三點:

1、學習統計。這是貫穿整個R學習的最重要的一部,很多時候你並不是不知道在哪裡找,怎麼使用某個函式的引數,更多的時候你是不知道某個統計方法的原理,所代表的意義甚至不知道該用什麼方法。所以學習統計學知識往往才是學習R的關鍵,之後找函式、怎麼用其實都是傻瓜式的,並不需要你從頭編寫演算法。這部分內容頁要結合每個人要做的事做

2、批量處理。由於R和matlab一樣,注重的是批量處理,而且R之中的迴圈往往效率極低,所以在R之中如果你發現你要使用雙層迴圈的時候,就要想想了,有沒有批量處理的方法。

a、首先,幾乎所有的R裡的運算子和自帶的函式都是可以批量處理的。比如向量a+向量b是指每個元素按照index相加,所以就沒必要for一下了;

b、其次,R自帶有的apply族函式(因為是一系列以apply結尾的函式,所以稱為apply族),split,以及aggregate函式。這三類就是R自帶的批量處理的利器,學好這三類函式,基本就可以完成絕大部分的資料批量處理了。

c、然後就是reshape2包以及plyr包了,這是批量處理的兩個利器,reshape主要是整形,plyr包基本提供了一套整理資料的理念,學好這兩個包,批量處理將事半功倍。

d、在實際過程中,一些for還是無法避免的。這時候就要考慮用別的語言來處理這部分事情了。比較常用的方法就是用別的語言批量生成R的程式碼,還有就是直接用R呼叫別的語言處理的結果或者用別的語言呼叫R的處理結果。

3、繪圖系統。總結而言,我們可以把R的繪圖系統分成四個:Graphics, lattice,ggplot2以及grid。最好學習順序也是按照這個來。

a、自帶的繪圖系統。這套系統可以完成最基本的事情,其操作也類似於matlab,可以看做是分步驟命令引數式繪圖,基本就是將一系列作圖看做一步步的命令,每一句都幹一件事,然後通過引數調整其中的某個元素的大小、位置、顏色。

b、lattice。繪圖邏輯也同上。只是加了分組繪圖、facet的功能,這些都很實用,其目的就是講自帶函式中需要大量預處理以及多步繪圖的命令用一行命令代替。上手也非常簡單。

c、ggplot2.這是經典的R繪圖包,繪圖哲學是圖層式的,理解成一個一個圖層的覆蓋。這個繪圖系統能做很多事,而且其自帶主題也相當漂亮。有一定的學習難度。以下就是我用ggplot畫的圖

d、grid。grid繪圖系統算是最基元的繪圖命令,很多指令都是從畫圓、直線、矩形開始的,這算是R裡最好理解但也是最複雜的繪圖系統。適合想入深坑的人士學習,如果要自由創造一些新的圖形,或者編寫繪圖包,這是必學的繪圖系統。另一個值得說的就是grid中也有專門用來整理拼圖的指令,這個對於有一些論文拼圖需求的人來說還是學學比較好。

如果你完成了以上兩個階段,你已經可以在工作學習中完成絕大部分的工作。但如果你是知識的創造者,或者是個程式設計師,或者是要實踐自己的演算法、理論、統計方法、繪圖方法,或者亦或是你只是腦抽了,那就要進入第三階段的學習。這部分包括,C語言掌握與精通、R語言除錯、改進、編寫包、寫一個地道的幫助文件、推銷自己的想法。這一階段完成了,你也就是一個R語言的大牛了。少年到處是你可以施展拳腳的地方。

由以上內容,可以基本上把學習路徑總結為下圖:

最後是學習資源的問題,總結如下:

1、課程類。 @uhuruqingcheng已經介紹的coursera上的課程的確很適合入門。

2、書籍類。建議入門用R語言實戰 (豆瓣),然後想要快速指南式的瞭解R語言的統計應用也可以看複雜資料統計方法 (豆瓣) 。統計學的內容按照自己的需要自行補充,在這裡就補推薦了,推薦了也是和R沒啥關係的。繪圖系統推薦兩本書就夠用了:ggplot2 (豆瓣) 和 R Graphics Cookbook (豆瓣)這兩本也都有中文版可以買到。如果這部分都已經學得不錯了,其實你就不需要書了,直接看R的幫助文件吧,help()或者? XXX 都可以。在此建議用RStudio,可以幫助你很快的檢視幫助,編寫script、斷點除錯等等。

需要補充的是springer出了一系列叫Use R! – Springer 的書,一直有更新,也是免費獲取的,大家可以自己下載。

3、網站類。

一個是部落格,以上已有推薦。

二是問答類的網站。Stack Overflow 和 SegmentFault 都可以嘗試一下。

三是R的journal。題主可以自行在google裡搜尋 R journal 第一個就是。

四是包和函式的搜尋網站Search all R packages and function manuals 。 這個網站提供R裡所有包和函式的搜尋系統。其貼心之處還有(1)提供分類功能;(2)提供下載的排名,每個包的下載時間線。

此外,其實R語言是一門輕程式設計重統計的語言,所以題主完全不需要擔心自己的程式設計基礎。直接做幾個小專案,你會很快上手,千萬不要從教材第一頁讀到最後一頁,那種效率極低,且容易半途而廢。

關於批處理的解答

有幾位同僚在回覆裡面詢問批處理的問題,這裡做個簡單的解釋。

批處理類似於向量運算,但也有很大差距,簡單的說,是一個函式可以快速的套用到多維變數的每一維值中。

1. 自帶函式的批處理

譬如:

這就是一個最簡單的批處理的例子,結果是

這是一個簡單的向量標量積結果,而所謂的批處理也就是類似於這種處理方式。而在R之中,資料的最小單元其實就是向量,因此,幾乎所有R的函式,都是批處理的。(注意,與matlab不同,matlab最小單元是矩陣,因此,其基本的運算都是基於舉證運算的)。我們可以用以下方式定義批處理函式:如果一個函式F,滿足,

且函式F的實現不基於任何顯式迴圈(諸如for,while, until),則函式F可以稱之為批處理函式。

譬如:plot(將兩個向量的對應的數逐個地畫到圖中),paste(將字串向量的每個字串都做連線)等等。。。

這裡比較一下會更加清楚,譬如如果在python裡實現以上功能(不實用pandas和numpy包),就得采用顯式的迴圈(for,while等):

因此,我們可以看出採用批處理最大的優點在於減少的程式碼量,並且更加簡潔明瞭,易於維護。

2. 批處理是否更加高效

其實批處理的另一個好處就是使得執行更加高效,因為批處理函式往往經過處理(使用更好的演算法或者更底層的實現方式)得到某種程度的提速。我們在這裡測試實現將向量每個元素都自乘2這一功能,分別採用按鍵替換,按數字索引替換以及直接批量處理的方式,來測試不同方式速度是如何的。

結果如下:

明顯看出,批處理並且避免顯式迴圈的方式的確有助於提高速度,程式碼量也少的多。因此,何樂而不為呢?

但是經過測試,並不是每個批處理函式的效果並不是都是那麼明顯,譬如:strsplit。甚至研究碼源之後,你也會發現,很多批處理常用的函式的實現其實都是for,因此,有一派觀點認為避免顯式迴圈(特別是指採用apply函式、plyr包的方法避免顯式迴圈),其實具有一定的誤導性,其是否能提高效率也是要視情況而定。

3. apply族函式和aggregate函式

這是R基礎包自帶的兩類用於批量處理的函式包,在此,只做簡單地介紹:

apply函式族共有五個,分別是:apply,lapply,sapply,tapply,vapply。其總用其實就是將某個函式逐個套用到向量(矩陣)中每個元素之中,其實具體的作用,讀幫助文件就可以了。

aggregate這個函式比較有意思,常用的帶入方式是:

作用就是基於by指定的變數做分組,計算FUN分別統計每個組的結果。

4. 幾個常用的批處理用的包

主要有:

reshape(最好用的是melt)

plyr(__ply族函式是最好用的,有一個很巧妙地邏輯,對於開發軟體包的人來說學習這個包很有啟發性;其次用ts比較多的人最好學一下round_any函式):此包入門有點難,有些人也吐槽效率;round_any+gglot2畫時間序列實在是太佳了。

data.table:這是一個網友的推薦,聽說很好用,效率也提高不少。

相關推薦

no