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