一文學會使用dplyr包進行數(shù)據(jù)轉(zhuǎn)換大家好,我是阿琛。可視化是展示結(jié)果的重要途徑與手段。在之前的內(nèi)容中,從認識ggplot2開始,我們相繼介紹了箱型圖,?;鶊D,棒棒糖圖,以及雷達圖等等。然而,不同的作圖方法對輸出數(shù)據(jù)的格式要求也不盡相同。在訓(xùn)練營以及平時的交流中,我發(fā)現(xiàn)即使將整個繪圖的代碼擺在眼前,很多小伙伴仍然感到無從下手,不知道如何將數(shù)據(jù)整理到合適格式。
當我們拿到一份數(shù)據(jù),無論是TCGA下載的轉(zhuǎn)錄組數(shù)據(jù),GEO數(shù)據(jù)庫中的芯片表達數(shù)據(jù),亦或者是自己測序等途徑得到的數(shù)據(jù)內(nèi)容,其數(shù)據(jù)格式正好完全符合我們需求的情況,是非常罕見的。一般來講,我們需要對數(shù)據(jù)進行預(yù)處理,比如提取其中的某些變量值,變量的重命名,創(chuàng)建一些新的統(tǒng)計變量等等,從而使得數(shù)據(jù)格式達到輸入要求,變得更容易處理。 關(guān)于這些內(nèi)容,Hadley Wickham大神已經(jīng)體我們充分進行了考慮,并由此創(chuàng)造了一個新的數(shù)據(jù)處理方式,即tidyverse中的一個核心R包---dplyr包。在介紹中,Hadley提到,dplyr是一種新的數(shù)據(jù)處理的語法,提供了一組一致的動詞來幫助您解決最常見的數(shù)據(jù)處理難題,它們分別是: 使用現(xiàn)有變量的函數(shù)創(chuàng)建新變量(mutate())將多個值總結(jié)為一個摘要統(tǒng)計量(summarize()) 接下來,我們一起來看一下這幾個函數(shù)的使用方法。
1.R包的安裝與讀取以及數(shù)據(jù)的讀取 首先加載tidyverse包,講解中的dplyr包屬于tidyverse包。if(!require(tidyverse))install.packages("tidyverse") library(tidyverse) 在加載tidyverse包時,在輸出信息中我們可以看到存在一些沖突信息,它會告訴你在dplyr包中有兩個函數(shù)與基礎(chǔ)R包的函數(shù)存在沖突。當我們要在加載了tidyverse包后,想使用基礎(chǔ)R包的這兩個函數(shù)時,需要提供其完整的名稱分別是stats::filter()和stats::lag()兩個。dat <- read.table("exp.txt", header=T, sep="\t", check.names=F, row.names = 1) dat[1:4,1:4] #查看數(shù)據(jù)類型 隨后,將數(shù)據(jù)讀取進來。在分析前,提取其前4行4列,我們先看一下這個數(shù)據(jù)的結(jié)構(gòu)與內(nèi)容,當然,也可以直接在RStudio中通過View(dat)來查看整個數(shù)據(jù)框??梢园l(fā)現(xiàn),在該數(shù)據(jù)集中,共包含80行,132列內(nèi)容,其中行名為患者的編號,第一列為患者的生存狀態(tài)(fustat),第二列為患者的分期(Stage),其后為130個不同的基因。首先,我們來篩選一下fustat為1,Stage為2的所有患者:dat2 <- filter(dat, fustat == 1, Stage == 2) 運行以后,dplyr包會執(zhí)行相應(yīng)的篩選操作,并返回一個新的數(shù)據(jù)框。但是,需要注意的是,dplyr包中的函數(shù)從來不會修改原數(shù)據(jù)框內(nèi)容。因此,如果想要保存運行結(jié)果,需要將其賦值給一個新的變量??梢园l(fā)現(xiàn),經(jīng)過篩選,最終得到7個樣本所組成的新數(shù)據(jù)集dat2。在篩選的過程中,我們需要熟悉如何運用比較運算或者邏輯運算過程,來快速且準確的篩選變量信息。在R語言中,其提供了一整套用于比較運算的符號,分別是:>,>=,<,<=,!=,以及==六種。#篩選stage為3和4的樣本(即Stage >= 3) dat3 <- filter(dat, Stage >= 3) #篩選fustat為1的患者(即fustat == 1或者fustat != 0) dat4 <- filter(dat, fustat == 1) dat4 <- filter(dat, fustat != 0) #得到的結(jié)果與上一句一致 #篩選LSR基因表達量小于4的樣本(即LSR < 4) dat5 <- filter(dat, LSR < 4) 大部分的比較方法與我們常規(guī)在數(shù)學或日常學習中的使用是一致的;
在此判斷是否相等使用的是==,而不是=(在R中,=表示賦值的含義); 關(guān)于“浮點數(shù)”的問題
sqrt(2)^2 == 2 #[1] FALSE 1/49 * 49 == 1 #[1] FALSE 是不是覺得十分神奇呢?這是因為計算機使用的是有限精度運算,每一步運算后其保存的均是一個近似值。因此,在比較這類運算結(jié)果時,我們不能使用==,而應(yīng)該借助near()函數(shù)的幫助:#near() near(sqrt(2)^2, 2) #[1] TRUE near(1/49 * 49, 1) #[1] TRUE 關(guān)于邏輯運算符,大家想必不會陌生吧。常用的布爾邏輯運算符包括:&(與),|(或),以及!(非)三種。#篩選stage為3和4的樣本(即Stage == 3 | Stage == 4) dat6 <- filter(dat, Stage == 3 | Stage == 4) #篩選fustat為0,且stage為3的樣本(fustat != 1 & Stage == 3) dat7 <- filter(dat, fustat != 1 & Stage == 3) 此外,還有一種十分有用的簡寫形式,即x %in% y(表示選取x是y中的一個值時的所有行)。這樣,上面的代碼就可以簡化為以下的形式:#%in%的使用 dat8 <- filter(dat, Stage %in% c(3,4)) #篩選stage為3和4的樣本 identical(dat6, dat8) #比較兩個數(shù)據(jù)集是否相同 #[1] TRUE 可以發(fā)現(xiàn),使用|得到的dat6與使用%in%得到的dat8之間是完全相同的兩個數(shù)據(jù)集。arrange()函數(shù)的使用方法與filter()函數(shù)比較相似,但是arange()函數(shù)的作用是改變行的順序。arrange(dat, desc(Stage)) 3.2 將數(shù)據(jù)框以fustat,Stage,以及XYLT2基因的表達量來進行排列arrange(dat, fustat, Stage, XYLT2) 可以發(fā)現(xiàn),當列名不止一個時,它會自動使用后面的列在前面排序的基礎(chǔ)上繼續(xù)排列,即當fustat相同時,根據(jù)Stage進行進一步的排列,依次往下。select(dat, fustat, Stage) 4.2 選擇在第一列fustat和第三列XYLT2之間的所有列select(dat, fustat:XYLT2) 4.3 選擇不在第一列fustat和第三列XYLT2之間的所有列select(dat, -(fustat:XYLT2)) 4.4 select()與everything()聯(lián)用當我們想要將幾個變量移動到數(shù)據(jù)框開頭時,則需要同時借助select()與everything()的作用。select(dat, XYLT2, LSR, everything()) 運行后,我們可以發(fā)現(xiàn),第三列XYLT2和第四列LSR被移動到了整個數(shù)據(jù)框的前兩列。此外,還可以在select()函數(shù)中使用一些輔助函數(shù),比如:starts_with("abc"):匹配以“abc”開頭的名稱 ends_with("xyz"):匹配以“xyz”結(jié)尾的名稱 contains("ijk"):匹配包含“abc”的名稱 matches("(.)\1"):選擇匹配正則表達式的變量 num_range("x", 1:3):匹配x1,x2和x3 好啦,本次的內(nèi)容先介紹到這里,剩下的兩個函數(shù)mutate()和summarize(),以及管道符號%>%的使用,我們將在下一期的內(nèi)容中進行詳細的介紹~以簡單易懂的介紹,帶領(lǐng)大家快速入門數(shù)據(jù)處理,我們下期再見~~
|