4.1? ? R and RStudio?簡(jiǎn)介
①安裝R、RStudio和R包:R可以從http://www.r-project.org下載。Rstudio可以從https://www.rstudio.com/products/rstudio/download3/下載胚迫,所有的統(tǒng)計(jì)分析和圖形都可以通過(guò)RStudio來(lái)實(shí)現(xiàn)。下載并安裝R和RStudio軟件后唾那,可以啟動(dòng)R或RStudio終端來(lái)安裝所需的軟件包访锻。在使用其功能之前,必須安裝并加載未出現(xiàn)在已安裝程序包矩陣中的任何程序包闹获∑谌可以使用install.Packages(“包名”)來(lái)安裝包。
> install.packages("ALDEx2")
在R中避诽,還可以從R終端菜單安裝其他軟件包“Packages” —>“select the CRAN mirror”—> “select repositories”龟虎。在RStudio中,可以單擊“Packages” —> ‘‘Install”—> type package name(如ALDEx2)沙庐,然后選擇從“Repository(CRAN鲤妥,CRANextra)”或“Package Archive File(.zip;. tar.gz)“安裝(如果在計(jì)算機(jī)中下載了R包)—> click “Install” to install additional packages。安裝后拱雏,可以通過(guò)以下命令將軟件包加載到R或RStudio中棉安,
> library(ALDEx2)
要查看安裝了哪些軟件包,請(qǐng)使用installed.Packages()命令铸抑。這將返回一個(gè)矩陣贡耽,其中包含已安裝的每個(gè)軟件包的行。鍵入以下命令顯示安裝在您的計(jì)算機(jī)上的前5個(gè)R包羡滑。
> installed.packages()[1:5,]
要查看是否已安裝特定軟件包(例如菇爪,ALDEx2),請(qǐng)輸入以下命令:
> a<-installed.packages()
> packages<-a[,1]
> is.element("ALDEx2", packages)
[1] TRUE
②Set Working Directory in R:作為R中的一個(gè)非常重要的概念柒昏,“工作目錄”是存儲(chǔ)特定項(xiàng)目的原始數(shù)據(jù)凳宙、R代碼和輸出的地方。為不同的項(xiàng)目創(chuàng)建特定的“工作目錄”职祷,需要讓R知道在哪里讀取數(shù)據(jù)和相關(guān)的R程序氏涩,因此需要將R工作目錄更改為該特定項(xiàng)目。在R和RStudio中有梆,可以更改不同項(xiàng)目的工作目錄是尖。要顯示工作目錄,可以輸入getwd()命令
> getwd()
[1] "C:/Users/Yinglin"
這顯示了當(dāng)前的Basic R文件夾泥耀。如果想要將工作目錄更改為R腳本饺汹、數(shù)據(jù)的特定文件夾,并將結(jié)果保存在此特定文件夾中痰催,可以將工作目錄設(shè)置為此文件夾兜辞。例如迎瞧,下面的R代碼創(chuàng)建一個(gè)目錄和文件夾‘’Analysis‘’來(lái)存儲(chǔ)R代碼、原始和中間數(shù)據(jù)文件以及分析結(jié)果
> setwd("E:/Home/MicrobiomeStatR/Analysis")
在RStudio中逸吵,還可以選擇“Session” —>“Set Working Directory”—>“To Source File Location”去設(shè)置工作目錄凶硅。如果不想將工作目錄設(shè)置為源文件位置,可以將其設(shè)置為“To Files Pane Location”或“Choose Directory”from Other Folder扫皱。再次檢查getwd()函數(shù)足绅,可以發(fā)現(xiàn)目錄已經(jīng)更改。
> getwd()
[1] "E:/Home/MicrobiomeStatR/Analysis"
通過(guò)輸入以下命令韩脑,可以將工作目錄設(shè)置回file pane folder:
> setwd("*/")
在RStudio中氢妈,還可以選擇“Session” —>“Set Working Directory”—>“To?Files Pane Location”?去做同樣的事情。
> getwd()
[1] "C:/Users/Yinglin"
如果目錄中存儲(chǔ)了R代碼文件(例如段多,“Rcodes.R”)允懂,可以使用 source (Rcodes.R)訪問(wèn)文件“Rcodes.R”并運(yùn)行該文件中包含的R代碼。該文件應(yīng)為純文本文件衩匣,saved with the extension. R。打開(kāi)RStudio時(shí)粥航,都會(huì)轉(zhuǎn)到默認(rèn)目錄琅捏。可以將默認(rèn)設(shè)置更改為我希望數(shù)據(jù)文件所在的文件夾递雀,這樣就不必每次都這樣做柄延。在菜單中,選擇Tools—>Global Options—>Default working
directory—> Browse—> 打開(kāi)想要的數(shù)據(jù)文件所在的文件夾 —>選擇文件夾缀程。
③通過(guò)RStudio進(jìn)行數(shù)據(jù)分析
RStudio的基本功能:RStudio允許用戶在更友好的環(huán)境中運(yùn)行R搜吧。RStudio屏幕通常由四個(gè)主要面板組成:source editor and data viewer; environment (workspace browser) and history; R console; and files, plots, packages, help and viewer.。大多數(shù)面板都有多個(gè)具有不同功能的表格杨凑。我們簡(jiǎn)要介紹每個(gè)面板及其基本功能滤奈,如下所示。
Source editor and data viewer:此面板位于左上角撩满。它是用于編輯文件的源編輯器和用于查看數(shù)據(jù)幀的數(shù)據(jù)查看器蜒程。它的意圖和用途與所有其他代碼編輯器的主窗口相同。我們可以在這里寫R腳本伺帘。有幾種方法可以創(chuàng)建新的R腳本昭躺;最方便的方法是轉(zhuǎn)到File—>New—>R Script。屏幕顯示后伪嫁,可以在那輸入R命令领炫。要運(yùn)行R腳本,請(qǐng)單擊右上角的“Run”按鈕张咳,或?qū)⒐鈽?biāo)放在命令所在行的任意位置帝洪,然后按Ctrl-R似舵。輸出將顯示在下面的控制臺(tái)中〉“Source? on Save”復(fù)選框表示“每次保存文件時(shí)都將文件內(nèi)容加載到控制臺(tái)的運(yùn)行時(shí)”啄枕。選中此框可使開(kāi)發(fā)流程更快,只需單擊一次族沃。
R console:RStudio提供的R控制臺(tái)面板位于左下角频祝;其功能與大多數(shù)R控制臺(tái)非常相似,例如脆淹,由Basic RGUI for Windows提供常空,可以在其中輸入命令并查看輸出。雖然可以在控制臺(tái)輸入命令盖溺,但它不是真正可重現(xiàn)的漓糙,因此不是一種有效的管理方式R腳本,建議使用源代碼編輯器編寫和管理R腳本烘嘱。
Environment and history:environment and history 選項(xiàng)卡在右上角昆禽。environment選項(xiàng)卡指的是控制臺(tái)環(huán)境,包括所有活動(dòng)對(duì)象蝇庭。此選項(xiàng)卡存儲(chǔ)在R會(huì)話期間創(chuàng)建的任何對(duì)象醉鳖、值、函數(shù)或任何內(nèi)容哮内。如果單擊“數(shù)據(jù)”下面列出的數(shù)據(jù)集的任何名稱盗棵,數(shù)據(jù)將顯示在數(shù)據(jù)查看器屏幕的左側(cè)“數(shù)據(jù)”。在這里北发,我們還可以手動(dòng)導(dǎo)入數(shù)據(jù)集纹因,并使其在控制臺(tái)中立即可用。history 選項(xiàng)卡保存自上次項(xiàng)目啟動(dòng)以來(lái)執(zhí)行的所有控制臺(tái)命令琳拨。它將保存到項(xiàng)目文件夾中的隱藏.RHistory文件中瞭恰。如果在會(huì)話后沒(méi)有選擇保存環(huán)境,則不會(huì)保存歷史記錄狱庇。這對(duì)測(cè)試是有幫助的寄疏。可以通過(guò)單擊“To Source”按鈕保存或選擇命令并將它們發(fā)送到R腳本僵井,或者通過(guò)單擊“To Console”按鈕將它們發(fā)送到R Console陕截。
Files, plots, packages, help and viewer:右下角面板是包含五個(gè)獨(dú)立選項(xiàng)卡的雜項(xiàng)面板。文件選項(xiàng)卡顯示默認(rèn)工作區(qū)中的所有文件和文件夾批什。Plots(繪圖)選項(xiàng)卡將顯示R會(huì)話期間的所有圖形农曲。在這里,我們可以縮放、導(dǎo)出乳规、配置和檢查圖形/圖形形葬。最常用的可能是導(dǎo)出和保存圖形。通過(guò)選擇以下選項(xiàng)暮的,可以導(dǎo)出和保存圖形笙以。
Export ! —>Save as Image —>Save plot as Image—> Image format—>choose one format from: JPEG, PNG, TIFF, BMP, Metafile, SVG, EPS—>Select the directory and name the graph—> Save.
? Export—> Save as PDF—> Select the directory and name the graph —>Save.
? Export—>Copy to Clipboard—>Copy plot to clipboard —>Copy as: Bitmap or Metafile—>Copy plot.
當(dāng)我們要?jiǎng)?chuàng)建文章質(zhì)量的圖形或在LaTeX文檔中使用它時(shí),前兩個(gè)選項(xiàng)非常有用冻辩。第三個(gè)選項(xiàng):復(fù)制和粘貼猖腕,可能是導(dǎo)出圖形最簡(jiǎn)單的方法,也是Word文檔中最常用的恨闪。Packages選項(xiàng)卡顯示RStudio中安裝的加載項(xiàng)軟件包的列表倘感。要將包加載到R中,需要檢查它們咙咽。正如在前面介紹的老玛,還可以通過(guò)單擊“安裝軟件包”按鈕來(lái)安裝其他軟件包。Help選項(xiàng)卡允許搜索有關(guān)R函數(shù)钧敞、數(shù)據(jù)集和包的內(nèi)置文檔蜡豹。當(dāng)調(diào)用?時(shí)溉苛,可以使用幫助選項(xiàng)卡余素。功能。當(dāng)在控制臺(tái)中輸入問(wèn)號(hào)后跟名稱(例如炊昆,?data.frame)或在源代碼編輯器中運(yùn)行它時(shí)威根,有關(guān)命令名稱(在本例中為數(shù)據(jù)框)的信息將自動(dòng)打開(kāi)凤巨。最后,查看器本質(zhì)上是RStudio的內(nèi)置瀏覽器洛搀。使用RStudio敢茁,可以通過(guò)Markdown輕松地開(kāi)發(fā)HTML文檔(網(wǎng)頁(yè))。查看器選項(xiàng)卡可以向顯示從R Markdown創(chuàng)建的結(jié)果HTML文件留美。
用RStudio展示數(shù)據(jù)分析:在本節(jié)中將說(shuō)明如何利用RStudio特性來(lái)創(chuàng)建 boxplot彰檬。使用的數(shù)據(jù)集hsb2demo可以在(https://stats.idre.ucla.edu/sas/output/regression-analysis/)上公開(kāi)獲得。數(shù)據(jù)集采用SAS數(shù)據(jù)格式谎砾,收集了200名高中生的數(shù)據(jù)逢倍,這些數(shù)據(jù)是各種測(cè)試的成績(jī),包括閱讀景图、寫作较雕、數(shù)學(xué)、科學(xué)和社會(huì)研究。性別變量是一個(gè)二分法變量亮蒋,如果學(xué)生是女性扣典,則編碼為1,如果是男性慎玖,則編碼為0贮尖。此數(shù)據(jù)集包含200行和11個(gè)變量。以下是各列中的變量(按順序)
Column name? ? ? ? ? ? ?Description? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??prog? ? ? ? ? ? ? ? ? ? ?Programs
id? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Subject id? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??read? ? ? ? ? ? ? ? ? ? ?Reading score
female? ? ? ? ? ? ? ? ? ? ? ? Gender variable? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?write? ? ? ? ? ? ? ? ? ? ? Writing score
race? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Race variable? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?math? ? ? ? ? ? ? ? ? ? ? Math score
ses? ? ? ? ? ? ? ? ? ? ? ? ? ?Socioeconomic status? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?science? ? ? ? ? ? ? ? ? Science score
schtyp? ? ? ? ? ? ? ? ? ? ? ? ? School types? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?socst? ? ? ? ? ? ? ? ? Social science score
展示了如何使用以下主要步驟創(chuàng)建按性別劃分的boxplot
首先趁怔,下載數(shù)據(jù)集湿硝,并將其轉(zhuǎn)換為CSV格式,并將其保存在以下目錄中痕钢。還通過(guò)以下方式將工作目錄設(shè)置為此目錄:Choose “Session”—>“Set Working Directory” —> “To Source File Location”.
> setwd("E:/Home/MicrobiomeStatR/Analysis")
接下來(lái)图柏,在RStudio中導(dǎo)入數(shù)據(jù)。有幾種方法可以將數(shù)據(jù)導(dǎo)入到R/RStudio中任连,可以通過(guò)R函數(shù)或R包蚤吹;將在下一節(jié)介紹一些廣泛使用的方法。在這里随抠,使用RStudio的導(dǎo)入數(shù)據(jù)集功能裁着。要執(zhí)行此操作,請(qǐng)執(zhí)行以下步驟拱她。
A.單擊Environment 選項(xiàng)卡右上角面板中的“Import? DataSet”按鈕二驰。B.單擊導(dǎo)入數(shù)據(jù)集對(duì)話框并選擇選項(xiàng)(From csv….; From Excel….; From SPSS….; From SAS….; From Stata…)。在本例中秉沼,選擇“From csv…“.C.瀏覽上面存儲(chǔ)數(shù)據(jù)集hsb2demo的文件夾·D.點(diǎn)擊“Open"—>Set Import Options(例如桶雀,分隔符、名稱和其他參數(shù)的首選項(xiàng))—>單擊“Import”.
現(xiàn)在唬复,數(shù)據(jù)集hsb2demo出現(xiàn)在左上角面板中以供查看矗积。可以通過(guò)View()函數(shù)查看此數(shù)據(jù)集:View(hsb2demo)?或從Environment選項(xiàng)卡下的“Data”列表中單擊hsb2demo的名稱(如果沒(méi)有出現(xiàn))敞咧。然后棘捣,創(chuàng)建了一個(gè)按性別書寫分?jǐn)?shù)的boxplot。RStudio的一個(gè)非常有用的功能是其內(nèi)置的R數(shù)據(jù)可視化工具休建≌Э郑可以使用R函數(shù)(例如,本例中的boxlot()函數(shù))創(chuàng)建繪圖并將其可視化测砂。
> #Boxplot of writing score by gender
> boxplot(write * female,data=hsb2demo, main="High School Students Data", xlab="Gender", ylab="Writing score by gender")
通過(guò)clicking Expor—>Copy to Clipboard—>Copy plot to clipboard—>Copy as: Bitmap—>Copy plot,paste it below:
如果想要?jiǎng)?chuàng)建高質(zhì)量的boxlot茵烈,可以使用ggplot2包,將在后面介紹這個(gè)包砌些。要使用該軟件包瞧毙,需要安裝ggplot2并通過(guò)調(diào)用庫(kù)(ggplot2)將其加載到R/RStudio,或者在RStudio中 click Packages—>check the box near to ggplot2.
④數(shù)據(jù)導(dǎo)入和導(dǎo)出:數(shù)據(jù)分析的關(guān)鍵步驟之一是將特殊格式的數(shù)據(jù)導(dǎo)入R工作區(qū)。微生物組研究中最常見(jiàn)的數(shù)據(jù)格式是逗號(hào)分隔的文件宙彪、Excel電子表格矩动、生物信息學(xué)分析生成的文件以及各種網(wǎng)站數(shù)據(jù)。R具有read.table()释漆、read.csv()和read.csv2()悲没、read.delim()等函數(shù),可以將數(shù)據(jù)從文件導(dǎo)入到R工作區(qū)男图。在這里示姿,我們介紹最常用的函數(shù)和工具。
Using read.table():首先逊笆,在介紹數(shù)據(jù)導(dǎo)入函數(shù)之前栈戳,先記下參數(shù)“string sAsFtors”。這是R中“data.frame()”函數(shù)的參數(shù)难裆,該函數(shù)指示數(shù)據(jù)框中的字符串是應(yīng)該被視為因子變量子檀,還是應(yīng)該僅被視為普通字符串。該參數(shù)也出現(xiàn)在“read.table()”和相關(guān)函數(shù)中乃戈,因?yàn)檫@些函數(shù)在讀取表格數(shù)據(jù)并將其轉(zhuǎn)換為數(shù)據(jù)框中扮演著重要角色褂痰。默認(rèn)情況下,在像Read這樣的函數(shù)中症虑,“string sAsFators”被設(shè)置為true缩歪。table()、read.csv()谍憔、read.csv2()和read.delim()將包含字符串的列作為因子導(dǎo)入R匪蝙。將字符串設(shè)置為因子的原因是告訴R將類別變量處理為單個(gè)虛擬變量,以便對(duì)lm()和glm()等函數(shù)進(jìn)行建模习贫。然而逛球,在基因組學(xué)或微生物組研究中,將一列數(shù)據(jù)中的基因或分類群的名稱編碼為因子是沒(méi)有意義的沈条,因?yàn)樗鼈儽举|(zhì)上只是標(biāo)簽,不能用于任何建模功能诅炉。在這種情況下蜡歹,可以將“string sAsFators”參數(shù)更改為false以更改默認(rèn)設(shè)置。R函數(shù)read.table()以純文本格式讀取表涕烧,單元格由以下符號(hào)之一分隔:一個(gè)或多個(gè)空格(“”)月而、制表符、換行符或回車议纯。例如父款,當(dāng)字段用逗號(hào)分隔并且每行開(kāi)始一個(gè)名稱(通常由Excel創(chuàng)建的文本格式)時(shí),可以使用函數(shù)read.table()將數(shù)據(jù)讀入R工作區(qū)。
> tab <- read.table("genus.csv", header=TRUE,row.names=1, sep=",")
其中憨攒,參數(shù)為true或T表示文本文件“genus.csv”的第一個(gè)條目應(yīng)該解釋為變量名世杀。參數(shù)row.ames=1表示第一列應(yīng)該解釋為行名,而不是變量肝集,參數(shù)sep=“瞻坝,”表示列之間用逗號(hào)分隔。
> tab <- read.table("genus.txt", header=TRUE,row.names=1, sep="\t")
參數(shù)sep=“\t”告訴R文件是制表符分隔的(使用“”表示文件是空格分隔的杏瞻;使用“所刀,”表示.csv文件中的逗號(hào)分隔)。如果表(例如捞挥,來(lái)自QIIME的OTU表)在標(biāo)題前有一行浮创,則需要指定 skip=1。如果標(biāo)題行以#開(kāi)頭砌函,則使用comment.char=“ ”讀取它們斩披。還可以訪問(wèn)當(dāng)前文件夾之外的文件夾中的文件。例如胸嘴,下面的read.able()鏈接指向Internet上的文件位置:
> raw<- "https://raw.githubusercontent.com/chvlyl/PLEASE/master/1_Data/Raw_Data/MetaPhlAn/PLEASE/G_Remove_unclassfied_Renormalized_Merge_Rel_MetaPhlAn_Result.xls"
> tab <- read.table(raw,sep='\t',header=TRUE,row.names = 1,check.names=FALSE,stringsAsFactors=FALSE)
參數(shù)check.ames=F有兩個(gè)原因雏掠。一種是告訴函數(shù)忽略重復(fù)的變量條目(即物種)。例如劣像,對(duì)于微生物組數(shù)據(jù)乡话,樣本表可以包含幾個(gè)同名的物種;另一個(gè)原因是告訴函數(shù)不要嘗試修改物種的名稱耳奕,以確保它們?cè)谡Z(yǔ)法上是正確的(否則绑青,名稱中的空格將被點(diǎn)號(hào)替換)。
Using read.delim():The read.delim()函數(shù)要求輸入表為純文本屋群,單元格由制表符分隔或分隔闸婴。
> tab <- read.delim("genus.txt", header=T, row.names=1)
打開(kāi)以制表符分隔的文件“genus.txt”。與read.delim()相比芍躏,可以看到read.table()在讀取文件類型中提供了更多的控制邪乍,因?yàn)樗梢宰x取.txt或.csv文件。它是更通用的函數(shù)read.table()的特定變體对竣。
Using read.csv() and read.csv2():*.csv格式的文件在不同的國(guó)家和不同的平臺(tái)上有不同的標(biāo)準(zhǔn)庇楞。在捷克語(yǔ)中,*.csv格式的文件的單元格用分號(hào)“否纬;”分隔吕晌,小數(shù)位用逗號(hào)“,”分隔临燃;而在西歐和其他地方睛驳,單元格用逗號(hào)“烙心,”分隔,小數(shù)位用點(diǎn)“.”分隔乏沸。函數(shù)的作用是:讀取表淫茵,用逗號(hào)“,”分隔屎蜓,小數(shù)是點(diǎn)“.”痘昌。函數(shù)的作用是:讀取由逗號(hào)“;”分隔的表格炬转,其中小數(shù)是逗號(hào)“辆苔,”。我們使用函數(shù)read.csv()讀取CSV文件扼劈,分隔符是逗號(hào)驻啤,小數(shù)點(diǎn)是點(diǎn),如下所示
> tab <- read.csv('table.csv', head = T, row.names = 1,sep =',', dec = '.')
如果文件“table.csv”的單元格由分號(hào)“荐吵;”分隔骑冗,并且使用小數(shù)分隔的逗號(hào)“,”先煎,則需要函數(shù)read.csv2()
> tab <- read.csv2 ('table.csv',head = T, row.names = 1, sep =';', dec = ',')
這類文件也可以使用read.table()函數(shù)讀取贼涩。參數(shù)sep=‘;’將分隔符設(shè)置為分號(hào)薯蝎,而dec=‘遥倦,’將小數(shù)分隔符設(shè)置為逗號(hào)。
> tab <- read.table (file = 'table.csv', head = T, row.names = 1, sep =';', dec = ',')
Using the gdata Package:Gdata包的read.xls()函數(shù)可以讀取表格占锯。該函數(shù)使用為腳本語(yǔ)言“Perl”開(kāi)發(fā)的模塊袒哥,因此需要安裝Perl。函數(shù)的作用是:首先將指定的工作表轉(zhuǎn)換為逗號(hào)分隔的文件消略,然后調(diào)用read.csv()函數(shù)堡称。因此,它接受read.csv()函數(shù)的所有選項(xiàng)艺演。這三個(gè)參數(shù)特別有用:the skip =?和header = arguments參數(shù)用于避免將標(biāo)題和注釋誤解為數(shù)據(jù)却紧,而as.is=TRUE參數(shù)可用于抑制因子轉(zhuǎn)換。
> install.packages("gdata")
> library(gdata)
> tab <- read.xls("table.xlsx",sheet=1,header=TRUE)
如果尚未安裝perl.exe文件胎撤,則上述R代碼不可執(zhí)行晓殊,并將給出一條錯(cuò)誤消息。如果發(fā)生這種情況哩照,需要下載perl.exe文件并將其保存在文件夾中挺物。在對(duì)read.xls的調(diào)用中懒浮,按如下方式指定它(這是我的perl.exe所在的位置飘弧,請(qǐng)檢查您的perl.exe识藤,可能會(huì)有所不同)。
> tab <- read.xls("table.xlsx", sheet=1,perl="C:/Perl64/bin/perl.exe")
Using the XLConnect Package:有時(shí)次伶,該文件被另存為Excel文件痴昧。可以直接從*.xls文件導(dǎo)入冠王。包XLConnect可以從R內(nèi)部讀取赶撰、寫入和操作Microsoft Excel文件。要使用此包柱彻,首先安裝它豪娜。可以使用.xls和.xlsx文件格式哟楷。函數(shù)readWorksheetFromFile()將打開(kāi)參數(shù)文件中指定的文件瘤载,并讀取參數(shù)表指定的表。其他參數(shù)類似于read.table()函數(shù)卖擅。
> install.packages ("XLConnect")
> library (XLConnect)
> tab <- readWorksheetFromFile(file = 'table.xlsx', sheet = 1, header = T, rownames = 1)
其他包(如xlsReadWrite鸣奔、xlsx)也可用于讀取和寫入Excel文件。它們的工作方式大致相同惩阶。
Using write.table() to Export Data:在微生物組研究中挎狸,經(jīng)常將分析結(jié)果導(dǎo)出或保存到外部文件中《峡基本工具是函數(shù)write.table()锨匆。它可以寫出Excel可讀的逗號(hào)分隔文件和記事本可讀的文本文件。
> write.table(genus, file="genus_out.csv", quote=FALSE, row.names=FALSE,sep="\t")
> write.table(genus, file="genus_out.txt", quote=FALSE, col.names=TRUE,sep=",")
其中脐嫂,write.table()的唯一必需參數(shù)是數(shù)據(jù)集或矩陣的名稱统刮。第二個(gè)參數(shù)file=用于將目的地指定為表示文件或連接的字符串。默認(rèn)情況下,字符串用引號(hào)括起來(lái)涎显∥宥剑可以使用引號(hào)=FALSE或F來(lái)取消它”揆茫可以使用row.names=false或col.names=false參數(shù)分別禁止將行名或列名寫入輸出文件。還可以選擇指定空格以外的分隔符娃善。Sep=“\t”用于制表符分隔论衍,sep=“,”用于逗號(hào)分隔聚磺。與函數(shù)read.csv()和read.csv2()類似坯台,write.table()的替代函數(shù)是write.csv()和write.csv2()。它們有適當(dāng)?shù)倪x項(xiàng)可供設(shè)置瘫寝,以生成逗號(hào)或分號(hào)分隔的文件蜒蕾。
⑤基本數(shù)據(jù)操作:本節(jié)中介紹一些基本的數(shù)據(jù)處理和操作技術(shù)稠炬,這些技術(shù)主要與數(shù)據(jù)框相關(guān)。數(shù)據(jù)框是長(zhǎng)度相等的矢量列表咪啡。數(shù)據(jù)框是R處理數(shù)據(jù)的對(duì)象首启。它通常指的是“表格”數(shù)據(jù):具有表示觀測(cè)或測(cè)量的行(有時(shí)稱為案例)和包含不同變量的值的列(通常稱為字段)的數(shù)據(jù)結(jié)構(gòu)。在微生物組研究中撤摸,病例可以是樣本毅桃,字段可以是屬、種准夷、OTUS或任何分類水平钥飞。除了數(shù)據(jù)之外,數(shù)據(jù)框通常還包含一些元數(shù)據(jù)衫嵌,例如行名和列名代承。類數(shù)據(jù)框的對(duì)象是R中處理表格統(tǒng)計(jì)數(shù)據(jù)的最重要的數(shù)據(jù)結(jié)構(gòu),默認(rèn)的R安裝有幾個(gè)數(shù)據(jù)集渐扮,這里我們用著名的iris數(shù)據(jù)集來(lái)說(shuō)明數(shù)據(jù)框的結(jié)構(gòu)和對(duì)數(shù)據(jù)框的一些基本操作论悴。iris數(shù)據(jù)框給出了分別來(lái)自3種iris(剛毛、雜色和處女花)各50朵花的變量萼片長(zhǎng)度和寬度以及花瓣長(zhǎng)度和寬度的測(cè)量結(jié)果(以厘米為單位)墓律。因此膀估,它有150個(gè)案例(行)和5個(gè)名為Sepal.Length、Sepal.Width耻讽、Petal.Length察纯、Petal的變量(列)。寬度和物種针肥。有關(guān)數(shù)據(jù)集的詳細(xì)信息饼记,請(qǐng)?jiān)赗或RStudio中鍵入help(Iris)。
Structure of Data Frame:在R或RStudio中輸入以下R代碼來(lái)加載數(shù)據(jù)和前幾行數(shù)據(jù)
> data()
> attach(iris)
> head(iris)
? ? ?Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1? ? ? ? ? 5.1? ? ? ? 3.5? ? ? ? ? 1.4? ? ? ? 0.2? setosa
2? ? ? ? ? 4.9? ? ? ? 3.0? ? ? ? ? 1.4? ? ? ? 0.2? setosa
3? ? ? ? ? 4.7? ? ? ? 3.2? ? ? ? ? 1.3? ? ? ? 0.2? setosa
4? ? ? ? ? 4.6? ? ? ? 3.1? ? ? ? ? 1.5? ? ? ? 0.2? setosa
5? ? ? ? ? 5.0? ? ? ? 3.6? ? ? ? ? 1.4? ? ? ? 0.2? setosa
6? ? ? ? ? 5.4? ? ? ? 3.9? ? ? ? ? 1.7? ? ? ? 0.4? setosa
這是一個(gè)數(shù)據(jù)框形式的表格慰枕。頂行稱為“標(biāo)題”具则,包含列名。之后的每個(gè)水平行都以該行的名稱開(kāi)頭具帮,然后是數(shù)據(jù)博肋。每行和每列數(shù)據(jù)構(gòu)成一個(gè)數(shù)據(jù)單元格。數(shù)據(jù)單元格可以通過(guò)方括號(hào)“[]”運(yùn)算符進(jìn)行檢索:[行的位置蜂厅,列的位置]匪凡。換句話說(shuō),坐標(biāo)以行位置開(kāi)始掘猿,然后是逗號(hào)病游,以列位置結(jié)束。
Create Data Frames:可以使用現(xiàn)有的數(shù)據(jù)框創(chuàng)建數(shù)據(jù)框稠通〕某模可以使用幾種技術(shù)來(lái)實(shí)現(xiàn)它
> #Create data frame using column indices
> df <- iris[,c(1,2,3)]
> head(df)
Sepal.Length Sepal.Width Petal.Length
1? ? ? ? ? 5.1? ? ? ? 3.5? ? ? ? ? 1.4
2? ? ? ? ? 4.9? ? ? ? 3.0? ? ? ? ? 1.4
3? ? ? ? ? 4.7? ? ? ? 3.2? ? ? ? ? 1.3
4? ? ? ? 4.6? ? ? ? 3.1? ? ? ? ? 1.5
5? ? ? ? ? 5.0? ? ? ? 3.6? ? ? ? ? 1.4
6? ? ? ? ? 5.4? ? ? ? 3.9? ? ? ? ? 1.7
> # Create data frame using column indices with sequences
> df <- iris[,c(1:2,4:5)]
> head(df)
Sepal.Length Sepal.Width Petal.Width Species
1? 5.1? ? ? ? 3.5? ? ? ? 0.2? setosa
2? ? ? ? ? 4.9? ? ? ? 3.0? ? ? ? 0.2? setosa
3? ? ? ? ? 4.7? ? ? ? 3.2? ? ? ? 0.2? setosa
4? ? ? ? ? 4.6? ? ? ? 3.1? ? ? ? 0.2? setosa
5? ? ? ? ? 5.0? ? ? ? 3.6? ? ? ? 0.2? setosa
6? ? ? ? ? 5.4? ? ? ? 3.9? ? ? ? 0.4? setosa
> #Create data frame using subset() and column indices
> df<- subset(iris, select=c(1,2, 4:5))
> head(df)
Sepal.Length Sepal.Width Petal.Width Species
1? ? ? ? ? 5.1? ? ? ? 3.5? ? ? ? 0.2? setosa
2? ? ? ? ? 4.9? ? ? ? 3.0? ? 0.2? setosa
3? ? ? ? ? 4.7? ? ? ? 3.2? ? ? ? 0.2? setosa
4? ? ? ? ? 4.6? ? ? ? 3.1? ? ? ? 0.2? setosa
5? ? ? ? ? 5.0? ? ? ? 3.6? ? ? ? 0.2? setosa
6? ? ? ? ? 5.4? ? ? ? 3.9? ? ? ? 0.4? setosa
> # Create data frame using subset() and column names
> df <- subset(iris, select=c("Sepal.Width", "Petal.Length", "Petal.Width"))
> head(df)
Sepal.Width Petal.Length Petal.Width
1? ? ? ? 3.5? ? ? ? ? 1.4? ? ? ? 0.2
2? ? ? ? 3.0? ? ? ? ? 1.4? ? ? ? 0.2
3? ? ? ? 3.2? ? ? ? ? 1.3? ? ? ? 0.2
4? ? ? 3.1? ? ? ? ? 1.5? ? ? ? 0.2
5? ? ? ? 3.6? ? ? ? ? 1.4? ? ? ? 0.2
6? ? ? ? 3.9? ? ? ? ? 1.7? ? ? ? 0.4
> # Create data frame by selecting column names
> df <- iris[,c("Sepal.Width", "Petal.Length", "Petal.Width")]
> head(df)
Sepal.Width Petal.Length Petal.Width
1? ? ? ? 3.5? ? ? ? ? 1.4? ? ? ? 0.2
2? ? ? ? 3.0? ? ? ? ? 1.4? ? ? ? 0.2
3? ? ? ? 3.2? ? ? ? ? 1.3? ? ? ? 0.2
4? ? ? ? 3.1? ? ? ? ? 1.5? ? ? ? 0.2
5? ? ? ? 3.6? ? ? ? ? 1.4? ? ? ? 0.2
6? ? ? ? 3.9? ? ? ? ? 1.7? ? ? ? 0.4
> #Create data frame using data.frame()
> df <- data.frame(iris$Sepal.Width, iris$Petal.Length, iris$Petal.Width)
> head(df)
iris.Sepal.Width iris.Petal.Length iris.Petal.Width
1? ? ? ? ? ? ? 3.5? ? ? ? ? ? ? 1.4? ? ? ? ? ? ? 0.2
2? ? ? ? ? ? ? 3.0? ? ? ? 1.4? ? ? ? ? ? ? 0.2
3? ? ? ? ? ? ? 3.2? ? ? ? ? ? ? 1.3? ? ? ? ? ? ? 0.2
4? ? ? ? ? ? ? 3.1? ? ? ? ? ? ? 1.5? ? ? ? ? ? ? 0.2
5? ? ? ? ? ? ? 3.6? ? ? ? ? ? ? 1.4? ? ? ? ? ? ? 0.2
6? ? ? ? ? ? ? 3.9? ? ? ? ? ? ? 1.7? ? ? ? ? ? ? 0.4
還可以使用c()和data.frame()手動(dòng)創(chuàng)建數(shù)據(jù)框轻绞。
> #Create data frame using c() manually
> Sepal.Width = c(3.5, 3.0, 3.2, 3.1,3.6,3.9)
> Petal.Length = c(1.4,1.4,1.3,1.5,1.4,1.7)
> Petal.Width = c(0.2,0.2,0.2,0.2,0.2,0.4)
> df = data.frame(Sepal.Width,Petal.Length,Petal.Width)
> df
Sepal.Width Petal.Length Petal.Width
1? ? ? ? 3.5? ? ? ? ? 1.4? ? ? ? 0.2
2? ? ? ? 3.0? ? ? ? ? 1.4? ? ? ? 0.2
3? ? ? ? 3.2? ? ? ? ? 1.3? ? ? ? 0.2
4? ? ? ? 3.1? ? ? ? ? 1.5? ? ? ? 0.2
5? ? ? ? 3.6? ? ? 1.4? ? ? ? 0.2
6? ? ? ? 3.9? ? ? ? ? 1.7? ? ? ? 0.4
Basic Operations:已經(jīng)使用head()函數(shù)來(lái)預(yù)覽數(shù)據(jù)框。
> head(iris)
默認(rèn)情況下佣耐,R使用數(shù)據(jù)框作為對(duì)象,有時(shí)需要檢查數(shù)據(jù)集唧龄,看看它是否是數(shù)據(jù)框兼砖。attributes()顯示列名( col.names)、行名(row.names)和class既棺,顯示數(shù)據(jù)集是否為數(shù)據(jù)框讽挟。
> attributes(iris)
或者也可以使用class()函數(shù)檢查數(shù)據(jù)集是否為數(shù)據(jù)框
> class(iris)
[1]"data.frame"
可以使用dim()函數(shù)檢查行數(shù)和列數(shù)
> dim(iris)
[1] 150 5
可以使用nrow()和ncol()函數(shù)找到行數(shù)和列數(shù)
> nrow(iris)
[1] 150
> ncol(iris)
[1] 5
矢量的長(zhǎng)度由下式給出
> length(iris[,"Species"])
[1] 150
可以使用rownames()和colnames()函數(shù)找到行名和列名。
> #check column or row names
> colnames(iris)
> rownames(iris)
可以使用print()函數(shù)print整個(gè)數(shù)據(jù)框
> print(iris)
如果只想print感興趣的列而不是整個(gè)數(shù)據(jù)框丸冕,可以使用
> Species <- iris[,"Species"]
> Species
The cell value can be accessed by索引:
> iris[1,3]
[1] 1.4
或者耽梅,也可以使用行名和列名代替索引
> iris["1", "Petal.Length"]
[1] 1.4
與使用正整數(shù)編制索引不同,也可以使用不屬于括號(hào)中給出的索引向量的負(fù)索引來(lái)訪問(wèn)單元格值胖烛。
> head(iris[,-c(4:5)])
Sepal.Length Sepal.Width Petal.Length
1? ? ? ? ? 5.1? ? ? ? 3.5? ? ? ? ? 1.4
2? ? ? ? ? 4.9? ? ? ? 3.0? ? ? ? ? 1.4
3? ? ? ? ? 4.7? ? ? ? 3.2? ? ? ? ? 1.3
4? ? ? ? ? 4.6? ? ? ? 3.1? ? ? ? ? 1.5
5? ? ? ? ? 5.0? ? ? ? 3.6? ? ? ? ? 1.4
6? ? ? ? ? 5.4? ? ? ? 3.9? ? ? ? ? 1.7
檢查微生物組數(shù)據(jù)的稀疏性:在微生物組研究中需要進(jìn)行一些特殊的數(shù)據(jù)處理眼姐。正如第二章中所描述的那樣微生物組數(shù)據(jù)的一個(gè)重要特征是零點(diǎn)多的稀疏性。為了檢查下表中的稀疏性佩番,使用下面的R代碼
> tab=read.csv("VdrGenusCounts.csv",row.names=1,check.names=FALSE)
> #Check total zeros in the table
> sum(tab == 0)
[1] 3103
> #Check how many non-zeros in the table
> sum(tab != 0)
[1] 865
關(guān)于圖形的幾個(gè)函數(shù):這里簡(jiǎn)要介紹ggplot2的概念和基礎(chǔ)知識(shí)众旗,以及圖形的兩個(gè)R函數(shù):par()和Layout()。
函數(shù) par ()?的作用是:設(shè)置或查詢圖形參數(shù)趟畏。有許多圖形參數(shù)可供使用贡歧,其中最常使用的是mar、mfcolo和mfrow赋秀。繪圖邊距的大小是以文本行為單位測(cè)量的利朵。標(biāo)記用于指定繪制繪圖四邊的線數(shù)中的頁(yè)邊距大小:C(下猎莲、左绍弟、上、右)著洼。默認(rèn)情況下晌柬,邊距為PAR(mar=(c(5,4郭脂,4年碘,2)+0.1))。參數(shù)mfrow和mfol用于控制同一頁(yè)上有多少個(gè)圖形展鸡。要記住這些函數(shù)的名稱屿衅,可以認(rèn)為它們代表“行中的多個(gè)框”(mfrow)或“列中的多個(gè)框”(mfcol)。我們可以使用par(mfrow)莹弊、par(mfcol)涤久、par(layout)和par()split.screen)在同一圖形設(shè)備上獲得多個(gè)圖形面板涡尘,但par(mfrow)經(jīng)常使用。mfrow有兩個(gè)參數(shù):第一個(gè)參數(shù)用于指定圖形的行數(shù)响迂,第二個(gè)參數(shù)用于每行圖形的列數(shù)考抄。每個(gè)屏幕一個(gè)繪圖的默認(rèn)值是一行、一列:par(mfrow=c(1蔗彤,1))川梅。作為mfrow()或fig()的替代方法,可以使用layout()函數(shù)來(lái)配置多個(gè)繪圖然遏。通過(guò)使用此功能贫途,可以獨(dú)立更改多個(gè)繪圖區(qū)的位置和形狀,給出了layout函數(shù)的一種語(yǔ)法:
layout (matrix;widths= w;heights = h )
其中待侵,矩陣是指定要在輸出設(shè)備上繪制的n個(gè)圖形的位置的矩陣對(duì)象丢早,w是列寬矢量(with length = ncol(matrix)),h是行高矢量(with length = nrow(matrix))秧倾。函數(shù)layout.show(n)繪制n個(gè)圖形的輪廓怨酝。例如使用Layout()在圖的頂部繪制聚類樹(shù)狀圖,在底部繪制堆疊的條形圖那先,在右側(cè)繪制圖例凫碌。R代碼如下:
> ng <- layout(matrix(c(1,3,2,3),2,2, byrow=TRUE), widths=c(5,2), height=c(3,4))
將顯示以下圖形的位置
> layout.show(ng)
其中,Layout()函數(shù)定義了三個(gè)圖形的位置:圖10.3是聚類樹(shù)狀圖胃榕,希望將其放在三個(gè)框的頂部盛险,圖10.4是將位于左下角的堆疊條形圖,圖10.4的圖例將在右側(cè)繪制勋又。
某些選項(xiàng)設(shè)置:選項(xiàng)設(shè)置允許設(shè)置和檢查global options苦掘,以告訴R如何計(jì)算和顯示其結(jié)果。參數(shù)width用于指定一行上要打印的最大列數(shù)楔壤,默認(rèn)情況下為80鹤啡;digits用于控制print數(shù)值時(shí)要print的有效位數(shù)。有效值為0…22蹲嚣,默認(rèn)值為7递瑰。這兩個(gè)參數(shù)可以一起使用,以確保輸出中的換行符與頁(yè)面寬度相對(duì)應(yīng)隙畜。更好的做法是在R會(huì)話中設(shè)置相同的設(shè)置抖部,例如,當(dāng)開(kāi)始新的R會(huì)話時(shí)议惰,我們可以設(shè)置:
> options(width=65,digits=4)
⑥簡(jiǎn)單匯總統(tǒng)計(jì)信息:要獲得有關(guān)R對(duì)象的概述慎颗,最有用的函數(shù)是Summary(),它提供基本匯總統(tǒng)計(jì)信息的集合。例如俯萎,可以對(duì) iris數(shù)據(jù)集使用summary()函數(shù)
> summary(iris)
Sepal.Length? Sepal.Width? ? Petal.Length? Petal.Width? ? ? ? Species?
Min.? :4.30? Min.? :2.00? Min.? :1.00? Min.? :0.1? setosa? ? :50?
1st Qu.:5.10? 1st Qu.:2.80? 1st Qu.:1.60? 1st Qu.:0.3? versicolor:50?
Median :5.80? Median :3.00? Median :4.35? Median :1.3? virginica :50?
Mean? :5.84? Mean? :3.06? Mean? :3.76? Mean? :1.2? ? ? ? ? ? ? ? ?
3rd Qu.:6.40? 3rd Qu.:3.30? 3rd Qu.:5.10? 3rd Qu.:1.8? ? ? ? ? ? ? ? ?
Max.? :7.90? Max.? :4.40? Max.? :6.90? Max.? :2.5
用于簡(jiǎn)單匯總統(tǒng)計(jì)的其他函數(shù)包括mean(), median(), min()和max()傲宜。經(jīng)常可以看到它們與apply()函數(shù)結(jié)合使用夫啊,以獲得矩陣或數(shù)組的每個(gè)維度的匯總統(tǒng)計(jì)信息函卒。此函數(shù)的用法為apply((DATA, MARGIN, FUN, OPTION)。需要三個(gè)參數(shù):data是數(shù)據(jù)框撇眯,包括要在其上執(zhí)行操作的矩陣报嵌;margin是告訴Apply()要對(duì)哪個(gè)維度進(jìn)行操作的索引,例如叛本,1表示矩陣的行,2表示列彤钟,c(1来候,2)表示行和列。下面的R代碼用于獲得行和列的平均值逸雹。
> iris_1 <- (iris[,-5])
> head(apply(iris_1, 1, mean))
[1] 2.550 2.375 2.350 2.350 2.550 2.850
> apply(iris_1, 2, mean)
Sepal.Length? Sepal.Width Petal.Length? Petal.Width
5.843? ? ? ? 3.057? ? ? ? 3.758? ? ? ? 1.199
> apply(iris_1, 2, mean,na.rm = TRUE)
Sepal.Length? Sepal.Width Petal.Length? Petal.Width
5.843? ? ? ? 3.057? ? ? ? 3.758? ? ? ? 1.199
用于匯總統(tǒng)計(jì)的apply()和其他函數(shù)在微生物組數(shù)據(jù)中有重要的應(yīng)用营搅。例如,以下代碼使用apply()函數(shù)計(jì)算每個(gè)樣本中每個(gè)分類單元(OTU)的豐度百分比
> tab_perc <- apply(tab, 2, function(x){x/sum(x)})
有時(shí)梆砸,分類單元豐度表的末尾有一個(gè)分類單元列转质;在這種情況下,需要使用?1索引來(lái)去掉它帖世,然后計(jì)算百分比休蟹。
> tab_perc <- apply(tab[,1:ncol(tab)-1], 2, function(x){x/sum(x)})
對(duì)于微生物組數(shù)據(jù)分析,經(jīng)常需要在分析前對(duì)每個(gè)樣本的分類單元豐度進(jìn)行過(guò)濾日矫。例如赂弓,以下代碼使用apply()函數(shù)去除任何百分比小于1%的樣本中的分類群:
> tab_p1 <- tab[apply(tab_perc, 1, max)>0.01,]
以下代碼用于在每個(gè)樣本中保留頻率>0.01的分類群(OTUs)
> tab_p2 <- tab[apply(tab_perc, 1, min)>0.01,]
> head(tab_p2)
5_15_drySt-28F 20_12_CeSt-28F 1_11_drySt-28F
Lactococcus? ? ? ? ? ? ? 326? ? ? ? ? ? 737? ? ? ? ? 2297
Lactobacillus? ? ? ? ? ? 94? ? ? ? ? ? 597? ? ? ? ? ? 434
Clostridium? ? ? ? ? ? ? 130? ? ? ? ? ? 401? ? ? ? ? ? 597
2_12_drySt-28F 3_13_drySt-28F 4_14_drySt-28F
Lactococcus? ? ? ? ? ? ? 548? ? ? ? ? 2378? ? ? ? ? ? 471
Lactobacillus? ? ? ? 719? ? ? ? ? ? 322? ? ? ? ? ? 205
Clostridium? ? ? ? ? ? ? 815? ? ? ? ? ? 203? ? ? ? ? ? 232
結(jié)合其他R函數(shù),apply()函數(shù)也可用于過(guò)濾分類群(OTUs)哪轿。例如盈魁,以下代碼將分界值設(shè)置為1,然后使用apply()窃诉、which()和mean()函數(shù)在所有樣本中丟棄平均計(jì)數(shù)<=1的分類(OTUs):
> count <- 1
> tab_min <- data.frame(tab[which(apply(tab, 1, function(x){mean(x)}) >count),], check.names=F)
以下代碼將分界值設(shè)置為0.5杨耙,然后使用apply()、whicht()和length()函數(shù)在一半或更多樣本中有零的情況下丟棄分類(OTUs):
> cutoff = .5
> tab_d5 <- data.frame(tab[which(apply(tab, 1, function(x){length(which(x!= 0))/length(x)}) > cutoff),])
以下代碼將中斷值設(shè)置為500飘痛,然后使用apply()珊膜、which()和sum()函數(shù)丟棄總計(jì)數(shù)<500(行和<500)的分類(OTUs)
> count = 500
> tab_c500 <- data.frame(tab[which(apply(tab, 1, function(x){sum(x)})> count),])
⑦其他有用的R函數(shù):
轉(zhuǎn)換數(shù)據(jù)框:要轉(zhuǎn)換iris數(shù)據(jù)框,使用t()函數(shù)
> #Converting data frames
> iris_t <-t(iris)
> iris_t[1:5,1:6]
[,1]? ? [,2]? ? [,3]? ? [,4]? ? [,5]? ? [,6]? ?
Sepal.Length "5.1"? ? "4.9"? ? "4.7"? ? "4.6"? ? "5.0"? ? "5.4"?
Sepal.Width? "3.5"? ? "3.0"? ? "3.2"? ? "3.1"? ? "3.6"? ? "3.9"?
Petal.Length "1.4"? ? "1.4"? ? "1.3"? ? "1.5"? ? "1.4"? ? "1.7"?
Petal.Width? "0.2"? ? "0.2"? ? "0.2"? ? "0.2"? ? "0.2"? ? "0.4"?
Species? ? ? "setosa" "setosa" "setosa" "setosa" "setosa" "setosa"
Sorting and Ordering Data Frames:將這兩個(gè)函數(shù)應(yīng)用于iris數(shù)據(jù)框并創(chuàng)建一個(gè)新的數(shù)據(jù)框宣脉,然后將它們進(jìn)行比較辅搬,如下所示
> #Sorting and ordering data frames
> iris_2 <- (iris[,-c(3:5)])
> sorted <- sort(iris_2$Sepal.Length)
> ordered <- order(iris_2$Sepal.Length)
> new_iris<- data.frame(iris_2,sorted,ordered)
> head(new_iris)
Sepal.Length Sepal.Width sorted ordered
1? ? ? ? ? 5.1? ? ? ? 3.5? ? 4.3? ? ? 14
2? ? ? ? ? 4.9? ? ? ? 3.0? ? 4.4? ? ? 9
3? ? ? ? ? 4.7? ? ? ? 3.2? ? 4.4? ? ? 39
4? ? ? ? ? 4.6? ? ? ? 3.1? ? 4.4? ? ? 43
5? ? ? ? 5.0? ? ? ? 3.6? ? 4.5? ? ? 42
6? ? ? ? ? 5.4? ? ? ? 3.9? ? 4.6? ? ? 4
sort()將Sepal.Length的值按升序排序。要按降序排序,使用逆序函數(shù)rev()堪遂,如下所示
> #Sorting and ordering data frames
> rev_iris <- rev(sort(iris_2$Sepal.Length))
> head(rev_iris)
[1] 7.9 7.7 7.7 7.7 7.7 7.6
此列sepal.Length中的數(shù)字是介于1和150之間的索引介蛉。order()返回包含排列的索引的整數(shù)向量,該排列將對(duì)列進(jìn)行升序排序溶褪。理解order()的最佳方法是認(rèn)為x[order(x)]的結(jié)果與sort(x)的結(jié)果相同币旧。因此,order()的以下兩個(gè)應(yīng)用程序與sort(iris_2$Sepal.Length)關(guān)于Sepal.Length的排序列相同猿妈。
> head(iris[order(Sepal.Length),])
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
14? ? ? ? ? 4.3? ? ? ? 3.0? ? ? ? ? 1.1? ? ? ? 0.1? setosa
9? ? ? ? ? 4.4? ? ? ? 2.9? ? ? ? ? 1.4? ? ? ? 0.2? setosa
39? ? ? ? ? 4.4? ? ? ? 3.0? ? ? ? ? 1.3? ? ? ? 0.2? setosa
43? ? ? ? ? 4.4? ? ? ? 3.2? ? ? ? ? 1.3? ? ? ? 0.2? setosa
42? ? ? ? ? 4.5? ? ? ? 2.3? ? ? ? ? 1.3? ? ? ? 0.3? setosa
4? ? ? ? ? 4.6? ? ? ? 3.1? ? ? ? ? 1.5? ? ? ? 0.2? setosa
> head(iris[order(iris[,'Sepal.Length']),])
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
14? ? ? ? ? 4.3? ? ? ? 3.0? ? ? ? ? 1.1? ? ? ? 0.1? setosa
9? ? ? ? ? 4.4? ? ? ? 2.9? ? ? ? ? 1.4? ? ? ? 0.2? setosa
39? ? ? ? ? 4.4? ? ? ? 3.0? ? ? 1.3? ? ? ? 0.2? setosa
43? ? ? ? ? 4.4? ? ? ? 3.2? ? ? ? ? 1.3? ? ? ? 0.2? setosa
42? ? ? ? ? 4.5? ? ? ? 2.3? ? ? ? ? 1.3? ? ? ? 0.3? setosa
4? ? ? ? ? 4.6? ? ? ? 3.1? ? ? ? ? 1.5? ? ? ? 0.2? setosa
使用ifelse()重新編碼變量:ifelse()函數(shù)對(duì)于根據(jù)原始值重新編碼變量非常有用吹菱,它完成兩個(gè)操作:如果條件為真,則執(zhí)行一項(xiàng)操作彭则;如果條件為假鳍刷,則執(zhí)行另一項(xiàng)操作。好處是:在執(zhí)行此操作時(shí)俯抖,該函數(shù)對(duì)整個(gè)向量執(zhí)行操作输瓜,而不使用循環(huán)。例如芬萍,假設(shè)想要基于Petal.Length的值創(chuàng)建一個(gè)組:如果Petal.Length小于4尤揣,則group=1,否則group=2柬祠。
> group <- ifelse(iris$Petal.Length < 4,1,2)
該函數(shù)可以嵌套北戏。回想一下漫蛔,在iris數(shù)據(jù)集中嗜愈,有三種:剛毛、雜色和維吉尼亞莽龟。下面的R代碼為這三個(gè)物種創(chuàng)建了三個(gè)組
> group_s <- ifelse(iris$Species %in% "setosa",1,? ifelse(iris$Species %in% "versicolor",2,3))
使用strplit()拆分字符串:函數(shù)strplit()的作用是:根據(jù)從字符串中選擇的子串芝硬,將字符向量的元素拆分成子字符串。一種語(yǔ)法是strplit(character string, split)轧房。其中拌阴,第一個(gè)參數(shù)是要拆分的字符串或字符串的向量,拆分參數(shù)是要拆分字符串的字符子串奶镶。如果拆分為空字符串(“”)迟赃,則在每個(gè)字符之間拆分字符串。函數(shù)strsplit()的作用是:輸出已拆分的字符串的每個(gè)元素的列表厂镇。例如纤壁,使用的一個(gè)微生物組數(shù)據(jù)示例具有以下格式,行為樣本捺信,列為分類群酌媒。分組信息在示例字符串內(nèi)
> tab_t<-t(tab)
> head(tab_t)[1:3,c("Tannerella", "Lactococcus", "Lactobacillus")]
Tannerella Lactococcus Lactobacillus
5_15_drySt-28F? ? ? ? 476? ? ? ? 326? ? ? ? ? ? 94
20_12_CeSt-28F? ? ? ? 67? ? ? ? 737? ? ? ? ? 597
1_11_drySt-28F? ? ? ? 549? ? ? ? 2297? ? ? ? ? 434
想用字符子串“_”拆分字符串(如欠痴,5_15_dryST-28F)。以下代碼實(shí)現(xiàn)了該目標(biāo)
> strsplit<-data.frame(row.names=rownames(tab_t),t(as.data.frame(strsplit
(rownames(tab_t),"_"))))
> head(strsplit
X1 X2? ? ? ? X3
5_15_drySt-28F? 5 15 drySt-28F
20_12_CeSt-28F 20 12? CeSt-28F
1_11_drySt-28F? 1 11 drySt-28F
2_12_drySt-28F? 2 12 drySt-28F
3_13_drySt-28F? 3 13 drySt-28F
4_14_drySt-28F? 4 14 drySt-28F
使用grep()和gsub()進(jìn)行字符串模式匹配和替換:R提供了幾個(gè)基于正則表達(dá)式的字符串搜索(或匹配)和替換函數(shù)秒咨。最常用的是grep()喇辽、sub()、gsub()雨席。給出了簡(jiǎn)單的語(yǔ)法:grep(pattern, string)菩咨、sub(pattern, replacement,string)和gsub(pattern, replacement, string)。grep()在字符向量(第二個(gè)參數(shù))中搜索匹配模式(第一個(gè)參數(shù))陡厘,而sub()和gsub()都執(zhí)行匹配替換抽米。參數(shù)字符串是一個(gè)字符向量。sub()和gsub()之間的區(qū)別在于:對(duì)于sub()糙置,替換正則表達(dá)式的第一個(gè)出現(xiàn)云茸,而對(duì)于gsub(),替換所有出現(xiàn)的正則表達(dá)式谤饭。這里展示了gsub()和grep()标捺。請(qǐng)注意,R將sub()网持、gsub()和grep()中的第一個(gè)參數(shù)(Pattern)視為正則表達(dá)式宜岛,以提高字符串匹配长踊、操作以及R代碼編寫和維護(hù)的效率功舀。正則表達(dá)式描述函數(shù)的模式,說(shuō)明“匹配”或“匹配和替換”字符串的內(nèi)容和方式身弊。正則表達(dá)式中的非字母數(shù)字符號(hào)/字符辟汰,如 “$”,“*”, “+”, “.”, “?”, “[”, “^”, “{”, “|”, “(”, “\\”稱為元字符。元字符是正則表達(dá)式的構(gòu)建塊阱佛。它們是正則表達(dá)式中的特定含義帖汞。要將R中的任何元字符作為常規(guī)字符匹配,需要在它們之前加上雙反斜杠“\\”進(jìn)行轉(zhuǎn)義凑术,而將反斜杠作為常規(guī)字符匹配時(shí)翩蘸,需要寫四個(gè)反斜杠。例如淮逊,為了告訴gsub()函數(shù)將“$”解釋為常規(guī)字符催首,在“$”前面加上一個(gè)雙反斜杠。
> re <- gsub(pattern = "\\$", replacement = ".", "metacharacters$uses$in$regular$expressions")
> r e
[1] "metacharacters.uses.in.regular.expressions"
下面泄鹏,函數(shù)gsub()將正則表達(dá)式\\.+解釋為:匹配并替換句點(diǎn)的一個(gè)或多個(gè)重復(fù)項(xiàng)郎任。
> df = data.frame(how...to...interpret...metacharacters = c(1, 2), in...regular...expressions = c(1,2))?
> df
how...to...interpret...metacharacters
1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1
2? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2
in...regular...expressions
1? ? ? ? ? ? ? ? ? ? ? 1
2? ? ? ? ? ? ? ? ? ? ? ? ? 2
> names(df) <- gsub(pattern = "\\.+", replacement = ".", x = names(df))
> names(df)
[1] "how.to.interpret.metacharacters"
[2] "in.regular.expressions"
正則表達(dá)式經(jīng)常出現(xiàn)在微生物組數(shù)據(jù)操作中。例如备籽,公開(kāi)可用的微生物組數(shù)據(jù)集“tongue_saliva”收集了舌頭和唾液樣本舶治。舌樣以td_開(kāi)頭,唾液以sa_開(kāi)頭。
> tab_ts <- read.table("tongue_saliva.txt", header=T, row.names=1,sep="\t")
> tab_tts <-t(tab_ts)
> rownames(tab_tts)[1:3]
[1] "td_114221" "td_111445" "td_111580"
> rownames(tab_tts)[201:203]
[1] "sa_106066" "sa_105780" "sa_103488"
要用單個(gè)有意義的名稱分別標(biāo)記這兩個(gè)樣本霉猛,例如“tongue”和“saliva”尺锚,可以使用以下R代碼:
> rownames(tab_tts) <- gsub("sa_.+", "saliva", rownames(tab_tts))
> rownames(tab_tts) <- gsub("td_.+", "tongue", rownames(tab_tts))
> rownames(tab_tts)[1:3]
[1] "tongue" "tongue" "tongue"
> rownames(tab_tts)[201:203]
[1] "saliva" "saliva" "saliva"
數(shù)據(jù)集“tongue_saliva”還包括一個(gè)表示分類群信息的列“tax.0”。從數(shù)據(jù)集中獲取它們韩脏。第一行顯示分類單元名稱以字符和“__”為前綴
> tax <- tab_ts$tax.0
> tax[1:3]
[1] Root;p__Proteobacteria;c__Betaproteobacteria;o__Neisseriales;f__Neisseriaceae;g__Neisseria
[2] Root;p__Bacteroidetes;c__Flavobacteria;o__Flavobacteriales;f__Flavobacteriaceae;g__Capnocytophaga
[3] Root;p__Actinobacteria;c__Actinobacteria;o__Actinomycetales;f__Actinomycetaceae;g__Actinomyces
為了更容易地操作數(shù)據(jù)缩麸,想要?jiǎng)h除它們∩氖福可以使用gsub()函數(shù)來(lái)完成此工作:
> tax_1 <- gsub(".+__", "", tax)
> tax_1[1:3]
[1] "Neisseria"? "Capnocytophaga" "Actinomyces"
在上面的gsub()函數(shù)應(yīng)用程序中杭朱,在正則表達(dá)式中使用元字符來(lái)匹配給定字符向量中的字符。grep()函數(shù)還接受正則表達(dá)式和字符串或字符串向量吹散。默認(rèn)情況下弧械,它返回與正則表達(dá)式匹配的字符串元素的索引。如果指定了value=TRUE參數(shù)空民,則它返回與表達(dá)式匹配的實(shí)際字符串
> grep("[wd]", c("Sepal.Length", "Sepal.Width", "Petal.Length","Petal.Width","Species"))
[1] 2 4
> grep("[wd]", c("Sepal.Length", "Sepal.Width", "Petal.Length","Petal.Width","Species"), value = TRUE)
[1] "Sepal.Width" "Petal.Width"
如果希望字符串按原樣匹配或按字面解釋(即不是正則表達(dá)式)刃唐,則使用fixed=TRUE參數(shù)
> grep("Width", c("Sepal.Length", "Sepal.Width", "Petal.Length","Petal.Width","Species"), value = TRUE,fixed =TRUE)
[1] "Sepal.Width" "Petal.Width"
使用rep()和grep()在微生物組數(shù)據(jù)中創(chuàng)建組變量:這些函數(shù)在微生物組數(shù)據(jù)中的一個(gè)重要用途是根據(jù)樣本信息創(chuàng)建組變量。
Use rep() to create groups:
以下代碼創(chuàng)建數(shù)值為1表示糞便(dryst)和2表示盲腸(CeSt)樣本的變量組
> group <- data.frame(c(rep(1,length(grep("drySt", colnames(tab)))),? rep(2, length(grep("CeSt", colnames(tab))))))
以下代碼創(chuàng)建了字符值為糞便表示drySt和盲腸表示CeSt樣本的變量組
> group_1 <- data.frame(c(rep("fecal",length(grep("drySt",colnames(tab)))),rep("cecal", length(grep("CeSt", colnames(tab))))))
Use grep() to create groups:以下R代碼使用grep()函數(shù)獲取包含兩組糞便和盲腸樣本的列界轩。它在列標(biāo)題中搜索并匹配以“drySt”或“CeSt”命名的示例的字符串画饥。
> fecal <- grep("drySt", colnames(tab))
> cecal <- grep("CeSt", colnames(tab))
> fecal
[ 1 ] 1 3 4 5 6 7 8 9
> cecal
[ 1 ] 2 10 11 12 13 14? 15 16
上述樣品不是分組訂購(gòu)的,也不是在實(shí)驗(yàn)條件下訂購(gòu)的浊猾。如果樣本是基于組或?qū)嶒?yàn)條件排序的抖甘,則可以使用rep()函數(shù)創(chuàng)建組變量,如下所示
> conds <- c(rep("fecal", 8), rep("CeSt", 8))
> conds
[1] "fecal" "fecal" "fecal" "fecal" "fecal" "fecal" "fecal"
[8] "fecal" "CeSt"? "CeSt"? "CeSt"? "CeSt"? "CeSt"? "CeSt"
[15] "CeSt"? "CeSt
> fecal<- colnames(tab)[grep("drySt", colnames(tab))] # fecal samples
> cecal <- colnames(tab)[grep("CeSt", colnames(tab))] # cecal samples
> df_mice <- data.frame(tab[,fecal], tab[,cecal]) # make a data frame
> head(df_mice)
X5_15_drySt.28F X1_11_drySt.28F X2_12_drySt.28F
Tannerella? ? ? ? ? ? ? ? ? ? ? ? ? ? 476? ? ? ? ? ? 549? ? ? ? ? ? 578
Lactococcus? ? ? ? ? ? ? ? ? ? ? ? ? ? 326? ? ? ? ? ? 2297? ? ? ? ? ? 548
Lactobacillus? ? ? ? ? ? ? ? ? ? ? 94? ? ? ? ? ? 434? ? ? ? ? ? 719
Lactobacillus::Lactococcus? ? ? ? ? ? ? 1? ? ? ? ? ? ? 25? ? ? ? ? ? ? 5
Parasutterella? ? ? ? ? ? ? ? ? ? ? ? ? 1? ? ? ? ? ? ? 1? ? ? ? ? ? ? 4
Helicobacter? ? ? ? ? ? ? ? ? ? ? ? ? ? 89? ? ? ? ? ? ? 0? ? ? ? ? ? ? 13
? ? ? ? ? ? ? ? ? ? ? ? ? X3_13_drySt.28F X4_14_drySt.28F X7_22_drySt.28F
Tannerella? ? ? ? ? ? ? ? ? ? ? ? ? ? 996? ? ? ? ? ? 404? ? ? ? ? ? 319
Lactococcus? ? ? ? ? ? ? ? ? ? ? ? ? 2378? ? ? ? ? ? 471? ? ? ? ? ? 882
Lactobacillus? ? ? ? ? ? ? ? ? ? ? ? ? 322? ? ? ? ? ? 205? ? ? ? ? ? 644
Lactobacillus::Lactococcus? ? ? ? ? ? ? 17? ? ? ? ? ? ? 1? ? ? ? ? ? ? 13
Parasutterella? ? ? ? ? ? ? ? ? ? ? ? ? 2? ? ? ? ? ? ? 0? ? ? ? ? ? ? 0
Helicobacter?