电竞比分网-中国电竞赛事及体育赛事平台

分享

神奇的lapply

 微笑如酒 2018-09-30

曾經(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格式的文件,  我們可以一個(gè)一個(gè)的讀:

  1. fcsv1 = read.csv('B cell receptor signaling pathway.csv')

  2. fcsv2 = read.csv('interferon-gamma-mediated signaling pathway.csv')

  3. fcsv3 = read.csv('leukocyte migration.csv')

  4. fcsv4 = read.csv('T cell receptor signaling pathway.csv')

如果有1000個(gè)文本呢,理論上對(duì)于一個(gè)會(huì)編程的人,重復(fù)的事情超過(guò)三次,他就受不了開(kāi)始編寫(xiě)批量操作的腳本了,哪怕這個(gè)事情最終只要重復(fù)四次就可以完成,

這不是作秀,這是態(tài)度,關(guān)乎程序員的尊嚴(yán)。 

如果用上lapply呢? 首先我們把需要讀取的文件名稱(chēng)提取出來(lái)

  1. files = list.files(pattern='*.csv')

  2. files

文件名稱(chēng)是這個(gè)樣子的

  1. > files

  2. [1] 'B cell receptor signaling pathway.csv'          

  3. [2] 'interferon-gamma-mediated signaling pathway.csv'

  4. [3] 'leukocyte migration.csv'                        

  5. [4] 'T cell receptor signaling pathway.csv'

現(xiàn)在我們批量讀取,x 是需要批量處理的因素,F(xiàn)UN表示施加的功能,這里是函數(shù)

lapply(X, FUN, ...)

  1. fcsv <>

讀取進(jìn)去后,這四個(gè)文件已列表的形式存在于fcsv中,我們還可以對(duì)他命名

  1. names(fcsv) <->

一般情況下,批量讀取數(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ú)窮的

  1. exp_df1 <- plyr::ldply(fcsv,="">

  2. exp_df2 = data.frame(do.call(rbind,fcsv))

  3. exp_df3 = dplyr::bind_rows(fcsv)

  4. exp_df4 = data.table::rbindlist(fcsv)

 最終都能實(shí)現(xiàn)功能,其中l(wèi)dply會(huì)把文件名稱(chēng)作為單獨(dú)的一列,所以多一列 ,而其他方法把文件名加上系數(shù)作為行名。

實(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ù)就行

  1. load('Lasso_df_20000_01.Rdata')

那么如何批量讀取Rdata呢,這里面有個(gè)小坑。

  1. files = list.files(pattern='*.Rdata')

  2. files

有6個(gè)文件需要讀取

  1. > files

  2. [1] 'Lasso_df_20000_01.Rdata' 'Lasso_df_20000_02.Rdata'

  3. [3] 'Lasso_df_20000_03.Rdata' 'Lasso_df_20000_04.Rdata'

  4. [5] 'Lasso_df_20000_05.Rdata' 'Lasso_df_20000_06.Rdata'

按照之前的思路,用lapply

  1. fload1 = lapply(files,load)

可以讀取,但是讀取到的是文件名稱(chēng),不是內(nèi)容,這是因?yàn)閘oad會(huì)把文件存到臨時(shí)地點(diǎn),lapply會(huì)把他破壞掉, 

下面的方法的兩種方法可以把數(shù)據(jù)導(dǎo)入進(jìn)來(lái),任意選取一種,就是告訴他讀取到全局環(huán)境變量中。

  1. fload2 = lapply(files,load,.GlobalEnv)

  2. fload3 = lapply(files,load,environment())

 數(shù)據(jù)被讀取進(jìn)來(lái),但是沒(méi)有被存入list中,這時(shí)候我們需要用get函數(shù)獲取到內(nèi)容

  1. fload = lapply(files, function(x) get(load(x)))

這就成功了,數(shù)據(jù)加起來(lái)有174Mb啊,同樣的,也有四種方法可以把他們合并

  1. df1 = plyr::ldply(fload, data.frame)

  2. df2 = data.frame(do.call(rbind,fload ))

  3. df3 = dplyr::bind_rows(fload )

  4. df4 = data.table::rbindlist(fload)

 這樣就很方便了。

第三,批量作圖。

只要lapply后面的函數(shù)不一樣,就可以實(shí)現(xiàn)很多批量操作,

我們以批量作圖這種直觀的方式闡述以下如何自定義函數(shù) 

本次還是使用以前的那個(gè)腫瘤表達(dá)數(shù)據(jù),這個(gè)數(shù)據(jù)被用過(guò)至少3次

Y叔推薦的這個(gè)圖有毒!

圖有毒系列之2

多個(gè)基因在多亞組疾病中的展示

我們加載數(shù)據(jù),加載R包,定義要作圖的基因

  1. load(file = 'TCGA_BRCA_exprSet_plot.Rda')

  2. library(ggstatsplot)

  3. genes <->'BRCA1','ESR1','TP53','ERBB2')

現(xiàn)在我們定義一個(gè)作圖的函數(shù),輸入基因就出圖

  1. tnplot <->function(gene,exprSet){

  2.  require(ggstatsplot)

  3.  ggbetweenstats(data = exprSet,

  4.                 x = sample,

  5.                 y = gene)

  6. }

我們輸入一個(gè)基因測(cè)試一下,發(fā)現(xiàn)可以

  1. tnplot('BRCA1',exprSet)

現(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中。

  1. p1 <- lapply(genes,="">

批量作圖展示

  1. library(cowplot)

  2. plot_grid(plotlist=p1,nrow =2,labels = LETTERS[1:4])

是不是很贊,當(dāng)然,lapply實(shí)現(xiàn)的是批量,具體有哪些驚艷的操作,取決于我們?nèi)绾螌?xiě)出使用的function。 

而函數(shù)是R語(yǔ)言進(jìn)階的另外一道坎,我也給自己丟下一個(gè)必填的坑。

Until next time,it‘s goodbye!


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多