小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

神奇的lapply

 微笑如酒 2018-09-30

曾經(jīng)有一位大神講過,區(qū)分R語言是否進階的標準是,能否用好apply。這個大神叫Jimmy。

其實,我們在之前用apply去批量做過生存分析,當時為了提升速度,還是用了R語言的并行策略,parApply

TCGA真實數(shù)據(jù)下的批量生存分析

apply家族中還有一個更加神奇運用更廣泛的成員,他的名字叫l(wèi)apply,也就是list + apply,顧名思義,他返回的數(shù)據(jù)是列表 

我們看看他的三個小應(yīng)用:

第一,批量操作。

加入我想讀入一下四個CSV格式的文件,  我們可以一個一個的讀:

  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個文本呢,理論上對于一個會編程的人,重復(fù)的事情超過三次,他就受不了開始編寫批量操作的腳本了,哪怕這個事情最終只要重復(fù)四次就可以完成,

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

如果用上lapply呢? 首先我們把需要讀取的文件名稱提取出來

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

  2. files

文件名稱是這個樣子的

  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 <>

讀取進去后,這四個文件已列表的形式存在于fcsv中,我們還可以對他命名

  1. names(fcsv) <->

一般情況下,批量讀取數(shù)據(jù)框后,還需要把他們合并,如果每一個文件的抬頭一樣,我們需要把文件按照行合并 這時候會得到一個大的數(shù)據(jù)框 

要實現(xiàn)這個操作有四種方法: 分別是ldply,do.call,dplyr包中的bind_rows,data.table包中的rbindlist,

實際上最常用的是前面兩個, 我最開始使用的是do.call, 這些方法也是變化無窮的

  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)

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

實際上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,一直到出圖為止。 

假如我的工作目錄中有這個文件,導(dǎo)入是這個樣子的,用load函數(shù)就行

  1. load('Lasso_df_20000_01.Rdata')

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

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

  2. files

有6個文件需要讀取

  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)

可以讀取,但是讀取到的是文件名稱,不是內(nèi)容,這是因為load會把文件存到臨時地點,lapply會把他破壞掉, 

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

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

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

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

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

這就成功了,數(shù)據(jù)加起來有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ù)不一樣,就可以實現(xiàn)很多批量操作,

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

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

Y叔推薦的這個圖有毒!

圖有毒系列之2

多個基因在多亞組疾病中的展示

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

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

  2. library(ggstatsplot)

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

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

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

  2.  require(ggstatsplot)

  3.  ggbetweenstats(data = exprSet,

  4.                 x = sample,

  5.                 y = gene)

  6. }

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

  1. tnplot('BRCA1',exprSet)

現(xiàn)在我們批量操作,還是用lapply,只不過當函數(shù)有多個參數(shù)的時候,第一個以外的寫在函數(shù)后面,以逗號分隔,三個四個都可以 

在本例中,expreSet這個數(shù)據(jù)集就是第二個參數(shù),讀取完畢后,所有的作圖數(shù)據(jù)存在p1中。

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

批量作圖展示

  1. library(cowplot)

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

是不是很贊,當然,lapply實現(xiàn)的是批量,具體有哪些驚艷的操作,取決于我們?nèi)绾螌懗鍪褂玫膄unction。 

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

Until next time,it‘s goodbye!


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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多