生信分析人員如何系統入門R(2019更新版)
- 2019 年 10 月 4 日
- 筆記
五年前作為一個初出茅廬的菜鳥生信工程師苦於沒有專業交流社群,遂自建了生信菜鳥團QQ群和部落格,一點一滴積累了數萬人氣,進而和若干圈內好友組建了生信技能樹聯盟,三年前的直播生物資訊學編程活動細節還歷歷在目,QQ群微信群記賬錄製影片忙的不亦樂乎,因此產生了程式語言系統入門系列教程,如下:
現在回過頭來看,很多教程已然過時,當然並不是說的知識點過時,其實linux基本上幾十年都沒有怎麼變動過基礎知識的,哪怕你現在搜索到十幾年前的linux教學影片,也不會覺得尷尬。主要是其中一些資源鏈接,一些小技巧都過時了,比如R語言安裝包,需求切換適合的鏡像,或者某些配套書籍課程的URL肯定也會成為死鏈啦,所以非常有必要系統性整理一下,最新生信分析人員如何系統入門R
寫在前面
R語言不僅在生物資訊數(主要體現在bioconductor系列包)據處理中發揮著重要作用,其實也是其他主流數據處理人士(包括互聯網,金融,遊戲行業)的首選工具。所以基本上找到我來諮詢如何入門生物資訊學的,我都是推薦他必須學的就是R。但是實際上呢,我作為老一輩的生信工程師,所以喜歡perl一點,排斥python,我也稍微看過一些python的語法,個人認為R和python呢almostly 幾乎 一模一樣的。R的特點就是內置了大量的函數,基本上你認識的英文單詞都可以是一個函數,即使不是,你也可以自定義為函數。搞清楚了函數和變數,就可以看懂大部分的R程式碼了。通常我給初學者的知識點路線圖如下:
- 了解常量和變數概念
- 加減乘除等運算(計算器)
- 多種數據類型(數值,字元,邏輯,因子)
- 多種數據結構(向量,矩陣,數組,數據框,列表)
- 文件讀取和寫出
- 簡單統計可視化
- 無限量函數學習
六步系統入門R語言
第一步:工欲善其事必先利其器
既然要學習R語言,配套的軟體工具必須要摸索到位,掌握一些神操作,大幅度提高你的生產力!
- 下載適合你作業系統的R語言的軟體:https://cran.r-project.org/bin/windows/base/ 或者 https://cran.r-project.org/bin/macosx/
- 下載Rstudio這個R編輯器:https://www.rstudio.com/products/rstudio/download/(在Rstudio裡面寫程式碼會比較方便)
這裡借用我們生信技能樹優秀講師(小潔)的R語言入門課程培訓PPT內容,給大家展現Rstudio介面:

幾個神技巧
這些技巧真的是一般人我不告訴他,僅僅是因為大家是生信技能樹的粉絲我才透露一下下,當然更多技巧你需要去B站看我的10個小時的R語言影片自行摸索啦!
- 用項目的方式管理你的程式碼!
- 用rdata文件來保存和載入(save和load)變數,類似於Excel表格軟體才能打開的xlxs後綴文件。
- 注意你的程式碼編輯的字元編碼格式,否則會出現亂碼。
- 如果是Windows用戶,注意修改環境變數,否則你的Rstudio會頻頻報錯。
- 善用tab鍵補全,哪怕把鍵盤的tab鍵按壞也無所謂!
第二步:變數和常量
R語言跟python一樣,並不是perl或者shell那樣需要一些特殊字元( $,@等等)開頭來代表它是一個變數,只需遵循變數命名規則的字元組合即可,所以呢,如果同樣的字元要昨晚常量就必須使用單雙引號這樣才能區分變數和常量,當然了,數字本身就只能是常量了,變數也不能以數字開頭,如果一個數字加上了引號,它就是常量的字元了。
更為詳細的介紹如下:

多種數據類型(數值,字元,邏輯,因子)
上面我們講解了最簡單的常量和變數,它們有數字和字元的差異,其實還有其它兩個常用的數據類型,就是邏輯和因子。(請注意,我沒有講解因子哦)

多種數據結構(向量,矩陣,數組,數據框,列表)
前面我們看到的常量和變數,都只有一個元素,是最簡單的向量,實際上向量可以有多個元素,比如小明同學這個變數,他可以有名字(通常是字元),也可以有語數外的考試成績(通常是數值),這就是長度不等的向量,如下:

但是通常一個班級不可能只有一個學生,如果有多個同學(還有小紅和小綠),他們都有語數外成績,就是一個矩陣了,一個二維矩陣,屬於數組的範疇。

同樣的道理,小明,小紅和小綠這3個同學的語數外三門考試的成績,可以跨越多個年度多次統計,這樣就多了一個時間的維度,就是三維數組啦!
同樣的道理,維度可以無限增加,比如增加一期中、期末考試的分類維度,就是4維數組。但這個不是重點。
重點是有些時候,向量和數組是不足以滿足現實需求的,比如考試成績裡面,語數外都是得分,是數字,當然沒有問題,但是呢,他們有一個政治成績是PASS和failed這樣的簡單分類,我們的數組描述起來就有點困難了。

不過,即使我們解決了數字與字元混排這個麻煩,通過引入數據框這個知識點,比如病人的臨床資訊,就可以有不同的列,分別是數字的年齡,字元的TNM分期等等。但是仍然是有個問題,因為它太規範了,只能是多少行多少列的規則格式,實際上有可能是同一個班級裡面的不同學生,他們可能是選修不同的課程,這樣他們記錄的成績本來就是不一樣的。

第三步:了解變數的基礎操作函數
有了變數和常量的概念,數據類型和數據結構的概念,我們就相當於是半隻腳踏入R語言的大門了,因為我們有了數值型向量,所以可以對他們進行加減乘除的基本數學運算,如下:

因為我們有了字元型向量,也可以對其進行一系列的字元串操作

到這裡,大家相當於把一本R語言教材書籍看了一半了,因為對沒有編程思維的人來說,僅僅是理解這些知識點就耗費了她幾個月的力氣,不過對於有編程思維的人來說,也就是一杯咖啡的功夫過去了而已。
還有更多的函數,有待大家自行摸索和練習,一般來說需要入門R,掌握的函數起碼得超過200個,更多函數,大家可以在我的生信五周年演講素材看到400行基礎程式碼:https://github.com/jmzeng1314/5years/blob/master/learn-R/tasks/1-guozi-400.R
str,class,names,row.names,col.names,length,unique,view,min,max,summay,table
這裡需要重點強調的就是學習help函數(你必須要把help函數用一百次以上,不然你不可能入門的!) 還需要仔細觀察你的變數被你操作過程的變化,所以str,class兩個函數也需要敲一百次以上。
值得提醒的是,通常我們的函數所操作的這些變數,都不是來自於我們自己創造,我們處理生物資訊學數據一般很少會手動創建這些對象,都是從文本裡面讀取,比如kegg資料庫文件,差異分析結果,RNA-seq的表達量矩陣,但是讀入之後,我們的重點就是知道它們變成了什麼,該如何去一步步的轉換它們。(就是大家通常說的數據清洗)
第四步:對變數的統計可視化
清洗好的變數就可以進行統計可視化啦,實際上大家只需要關心兩大類統計概念,即:
- 一:描述性統計,充分了解你的數據,分析數據的
集中趨勢
和離散趨勢
等統計學指標並且可視化 - 二:推斷統計學,根據
樣本
數據去推斷總體
數量特徵的方法。它是在對樣本數據進行描述的基礎上,對統計總體的未知數量特徵做出以概率形式表述的推斷。
數據總體來說可以分為以下三種類型:
- 一:分類數據,又名定性數據或者品質數據。
- 二:順序數據。它其實是是分類數據的一種
- 三:數值型數據,又名定量數據,這個才是重點。又可以分成離散型和連續型
定量數據的集中趨勢指標主要是:眾數、分位數和平均數
, 定量數據的離散趨勢指標主要是:極差,方差和標準差,標準分數,相對離散係數(變異係數),偏態係數與峰態係數
如果大家的英語還不錯,就可以很容易看懂R裡面的簡單統計函數,無非就是 mean,sd,mad,cv,max,min,median等等。所以我針對性的出了30題考核大家的統計學:30道練習題帶你玩轉統計學的R語言版
在R裡面,基本上任何數據都可以進行可視化,簡簡單單的幾行繪圖程式碼就可以畫一大堆的圖,plot,boxplot,barplot,pie,hist,pair,它們每個繪圖函數都有自己要求的輸入數據,特定的可視化結果,請務必在還沒熟練使用之前help一下它們,自己主動查看它們好玩的地方,好好自學,下面我簡單列出部分,如果大家確實感興趣可以在我的生信五周年演講素材看到600行的基礎繪圖練習程式碼:https://github.com/jmzeng1314/5years/blob/master/learn-R/tasks/2-chunjuan-600.R
dev.new()新建畫板 plot()繪製點線圖,條形圖,散點圖. barplot( ) 繪製條形圖 dotchart( ) 繪製點圖 pie( )繪製餅圖. pair( )繪製散點圖陣 boxplot( )繪製箱線圖 hist( )繪製直方圖 scatterplot3D( )繪製3D散點圖. 低級繪圖函數: par() 可以添加很多參數來修改圖形 title( ) 添加標題 axis( ) 調整刻度 rug( ) 添加軸密度 grid( ) 添加網格線 abline( ) 添加直線 lines( ) 添加曲線 text( ) 添加標籤 legend() 添加圖例
上面提到的這些函數基本上都有一系列的繪圖參數(坐標軸、圖例,顏色,性狀,大小,空白,布局) , 非常繁瑣,想掌握,花費的時間會非常多,但是很多人直接跳到ggplot的繪圖世界了,不想搞那麼多底層繪圖程式碼。但是我看過一個底層R繪圖集大成者,就Combining gene mutation with gene expression data improves outcome prediction in myelodysplastic syndromes文章的作者的github裡面有。但是對大部分人來說,生信的繪圖,都是有套路的,其實都被別人包裝成函數了,做好數據,一個函數就出了所有複雜的圖。比如熱圖,cluster等等。
至於高級可視化,就不得不提ggplot2了
因為ggplot2本身包含數據映射到圖形元素的思想,不會適合所有人,而且講解起來差不多也可以寫一本書了,大家熟知的 http://www.cookbook-r.com/Graphs/ 就是這樣的一本書,把它從頭到尾程式碼練習一遍就差不多了。
可能對大部分初學者來說,ggpubr加上http://www.sthda.com/ 會更方便,基本上你想繪製的圖都被高手寫過教程,一搜索就可以獲得。
同樣的,我也針對性的出了30個考核題給到大家:基於R的可視化習題30個
第五步:數據對象的高級操作
普通數據(向量,數據框,數組,列表)的高級操作,主要是apply家族函數,以及aggregate,merge, split,by 等函數的用法。這是一個分水嶺,用好了你就才可能是R入門了。也可以用一些包,比如reshape2,dplyr,可以做數據的高級操作。值得一提的是對大部分編程思維不夠的朋友來說,可能需要有人講解會方便入門。
數據對象的高級操作,主要是S3,S4對象,更多的是學習提出這個對象的R包的文檔,比如我最近在單細胞天地集中介紹的5大單細胞流程R包:scater,monocle,Seurat,scran,M3Drop 需要熟練掌握它們的對象,:一些單細胞轉錄組R包的對象 而且分析流程也大同小異:
- step1: 創建對象
- step2: 品質控制
- step3: 表達量的標準化和歸一化
- step4: 去除干擾因素(多個樣本整合)
- step5: 判斷重要的基因
- step6: 多種降維演算法
- step7: 可視化降維結果
- step8: 多種聚類演算法
- step9: 聚類後找每個細胞亞群的標誌基因
- step10: 繼續分類
所謂對象,就是嵌套了不同的基礎數據,包括向量,數據框,數組,列表,打包在了一起,這樣可以統一操作,方便數據管理。
關於循環,實際上這裡需要一個動圖來展現,在我的生信五周年演講我都提到過,恰好在鄭州演講被粉絲錄屏了,所以感興趣的可以自行去聽那20分鐘的影片,錄屏,素材和影片都在微雲,https://share.weiyun.com/5NRQO8t
第六步:無限R包或函數
前面我們提到過,掌握了變數和常量的概念,數據類型和數據結構的概念,我們就相當於是半隻腳踏入R語言的大門了,然後加上這些數據的高級操作,就相當於入門了,可是R語言遠不止那麼簡單,不同的人使用它的效率千差萬別,比如因為可以自定義函數,所以我一行程式碼就可以完成3個R包的RNA-seq差異分析,見https://mp.weixin.qq.com/s/a5oAjpmnz1Jyx1fX89G1kw 因為持續學習,所以我可以通過現成的R包來自動化完成臨床三線表,見https://mp.weixin.qq.com/s/N-Zlwz-IDG7p07A-NdAVJg
對於生信工程師來說呢,主要是遨遊R的bioconductor世界,這也是為什麼我要求搞生物資訊學數據處理的人必須學習R,就是為了應用大量的bioconductor包。每學一個bioconductor的包,都是自己R水平的提升。大家可以參考我的部落格:http://www.bio-info-trainee.com/tag/bioconductor 我就是這樣學習過來的。我還創建了bioconductor中國這個社區,可惜效果不好,有志者可以繼續聯繫我,我們看看有沒有可能做起來。
R語言的應用方向當然R肯定不只生物資訊學啦,其實它在非常多的地方都有應用,尤其是金融和地理。在如何一個方向學習R,就不僅僅是R本身的語法了,你需要學習的東西太多了,我簡單列出幾個我接觸過的方向吧:統計,科學計算,數據挖掘,文本挖掘,基礎繪圖,ggplot繪圖,高級編程,都有著豐富的書籍和影片資料。
學習資源推薦
部分優秀導航貼:
- R語言學習入門導航-特別版
- R語言入門學習路徑+資源集(生信篇)
- R語言的最好資源,一個就夠!
- 生信人的R語言書單(文末贈書
- 生信人應該這樣學R語言系列影片學習心得筆記分享
- 如何通過Google來使用ggplot2可視化
一些電子書推薦:
《A Handbook of Statistical Analyses_Using_R》 《Modern Applied Statistics With S》 《Introduction to Scientific Programming and Simulation Using R》 《Mastering Scientific Computing with R》 《Practical Data Science with R》 《Data Mining explain using R》 《ggplot2 Elegant Graphics for Data Analysis》 《R Graphics Cookbook》 《R Cookbook》 《R in a Nutshell》 《R Programming for Bioinformatics》 《software for data analysis programming with R》
看完以上這些,你就是R大神了。當然,前提是你看懂了也會靈活應用。
有小夥伴建議我繼續以送影片送書籍的方式來增加瀏覽量,比如我網盤裡面有幾千本R語言的PDF書籍,也有十幾套影片,但是,我這一篇總結寫的太好了,我不想被利益被污染了,希望你可以轉發給有需要的人,你的朋友會感激你的轉發,讓他結識了這麼多生信前輩的經驗分享公眾號!
寫在最後
借鑒一個生物資訊學習方法:知識和耐心,是成為強者的唯一方法。
- 通過閱讀來學習:閱讀經典的教材、程式碼、論文、公開課。
- 通過牛人來學習:同行的聚會(比如生信五周年)、討論(QQ群或者微信群)、大牛的部落格、微博、twitter、RSS。
- 通過練習來學習:程式碼練習題、參加編程比賽、解決實際工作中的難題。
- 通過分享來學習:自己寫筆記、寫部落格、寫書、翻譯書,和同伴分享交流、培訓新人
留給大家一些作業
生信基石之R語言,B站的10個小時教學影片務必看完,參考 GitHub 倉庫存放的相關學習路線指導資料:https://github.com/jmzeng1314/R_bilibili
- 初級10 個題目:http://www.bio-info-trainee.com/3793.html
- 中級要求是:http://www.bio-info-trainee.com/3750.html
- 高級要求是完成20題:http://www.bio-info-trainee.com/3415.html
- 統計專題 30題:http://www.bio-info-trainee.com/4385.html
- 可視化專題30題:http://www.bio-info-trainee.com/4387.html