乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      神奇的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ù)是列表 

      我們看看他的三個小應用:

      第一,批量操作。

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

      這不是作秀,這是態(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,一直到出圖為止。 

      假如我的工作目錄中有這個文件,導入是這個樣子的,用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ù)導入進來,任意選取一種,就是告訴他讀取到全局環(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)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多