曾經(jīng)有一位大神講過,區(qū)分R語言是否進階的標準是,能否用好apply。這個大神叫Jimmy。 其實,我們在之前用apply去批量做過生存分析,當時為了提升速度,還是用了R語言的并行策略,parApply apply家族中還有一個更加神奇運用更廣泛的成員,他的名字叫l(wèi)apply,也就是list + apply,顧名思義,他返回的數(shù)據(jù)是列表 我們看看他的三個小應用: 第一,批量操作。 加入我想讀入一下四個CSV格式的文件,
如果有1000個文本呢,理論上對于一個會編程的人,重復的事情超過三次,他就受不了開始編寫批量操作的腳本了,哪怕這個事情最終只要重復四次就可以完成, 這不是作秀,這是態(tài)度,關(guān)乎程序員的尊嚴。 如果用上lapply呢? 首先我們把需要讀取的文件名稱提取出來
文件名稱是這個樣子的
現(xiàn)在我們批量讀取,x 是需要批量處理的因素,F(xiàn)UN表示施加的功能,這里是函數(shù)
讀取進去后,這四個文件已列表的形式存在于fcsv中,我們還可以對他命名
一般情況下,批量讀取數(shù)據(jù)框后,還需要把他們合并,如果每一個文件的抬頭一樣,我們需要把文件按照行合并 這時候會得到一個大的數(shù)據(jù)框 要實現(xiàn)這個操作有四種方法: 分別是ldply,do.call,dplyr包中的bind_rows,data.table包中的rbindlist, 實際上最常用的是前面兩個, 我最開始使用的是do.call, 這些方法也是變化無窮的
實際上lapply只是實現(xiàn)批量操作,配套的函數(shù),function才是他神奇的點睛之筆,我們可以用內(nèi)置函數(shù),比如,read.csv 也可以用自己定義的函數(shù),這個在第三條的時候再說。 第二,批量讀取Rdata數(shù)據(jù)。把數(shù)據(jù)儲存成Rdata是我R語言路上一個豁然開朗的瞬間,也是偉人Jimmy教給我的。 從此我告別了把數(shù)據(jù)在R語言里面寫來寫去的日子,所有中間數(shù)據(jù)保存成Rdata,一直到出圖為止。 假如我的工作目錄中有這個文件,導入是這個樣子的,用load函數(shù)就行
那么如何批量讀取Rdata呢,這里面有個小坑。
有6個文件需要讀取
按照之前的思路,用lapply
可以讀取,但是讀取到的是文件名稱,不是內(nèi)容,這是因為load會把文件存到臨時地點,lapply會把他破壞掉, 下面的方法的兩種方法可以把數(shù)據(jù)導入進來,任意選取一種,就是告訴他讀取到全局環(huán)境變量中。
這就成功了,數(shù)據(jù)加起來有174Mb啊,同樣的,也有四種方法可以把他們合并
第三,批量作圖。只要lapply后面的函數(shù)不一樣,就可以實現(xiàn)很多批量操作, 我們以批量作圖這種直觀的方式闡述以下如何自定義函數(shù) 本次還是使用以前的那個腫瘤表達數(shù)據(jù),這個數(shù)據(jù)被用過至少3次 我們加載數(shù)據(jù),加載R包,定義要作圖的基因
現(xiàn)在我們定義一個作圖的函數(shù),輸入基因就出圖
我們輸入一個基因測試一下,發(fā)現(xiàn)可以
現(xiàn)在我們批量操作,還是用lapply,只不過當函數(shù)有多個參數(shù)的時候,第一個以外的寫在函數(shù)后面,以逗號分隔,三個四個都可以 在本例中,expreSet這個數(shù)據(jù)集就是第二個參數(shù),讀取完畢后,所有的作圖數(shù)據(jù)存在p1中。
批量作圖展示
是不是很贊,當然,lapply實現(xiàn)的是批量,具體有哪些驚艷的操作,取決于我們?nèi)绾螌懗鍪褂玫膄unction。 而函數(shù)是R語言進階的另外一道坎,我也給自己丟下一個必填的坑。 Until next time,it‘s goodbye! |
|