第四章第一节 R、RStudio和ggplot2简介

4.1    R and RStudio 简介

①安装R、RStudio和R包:R可以从http://www.r-project.org下载。Rstudio可以从https://www.rstudio.com/products/rstudio/download3/下载,所有的统计分析和图形都可以通过RStudio来实现。下载并安装R和RStudio软件后,可以启动R或RStudio终端来安装所需的软件包。在使用其功能之前,必须安装并加载未出现在已安装程序包矩阵中的任何程序包。可以使用install.Packages(“包名”)来安装包。

> 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)“安装(如果在计算机中下载了R包)—> click “Install” to install additional packages。安装后,可以通过以下命令将软件包加载到R或RStudio中,

> library(ALDEx2)

要查看安装了哪些软件包,请使用installed.Packages()命令。这将返回一个矩阵,其中包含已安装的每个软件包的行。键入以下命令显示安装在您的计算机上的前5个R包。

> installed.packages()[1:5,]

要查看是否已安装特定软件包(例如,ALDEx2),请输入以下命令:

> a<-installed.packages()

> packages<-a[,1]

> is.element("ALDEx2", packages)

[1] TRUE

②Set Working Directory in R:作为R中的一个非常重要的概念,“工作目录”是存储特定项目的原始数据、R代码和输出的地方。为不同的项目创建特定的“工作目录”,需要让R知道在哪里读取数据和相关的R程序,因此需要将R工作目录更改为该特定项目。在R和RStudio中,可以更改不同项目的工作目录。要显示工作目录,可以输入getwd()命令

> getwd()

[1] "C:/Users/Yinglin"

这显示了当前的Basic R文件夹。如果想要将工作目录更改为R脚本、数据的特定文件夹,并将结果保存在此特定文件夹中,可以将工作目录设置为此文件夹。例如,下面的R代码创建一个目录和文件夹‘’Analysis‘’来存储R代码、原始和中间数据文件以及分析结果

> setwd("E:/Home/MicrobiomeStatR/Analysis")

在RStudio中,还可以选择“Session” —>“Set Working Directory”—>“To Source File Location”去设置工作目录。如果不想将工作目录设置为源文件位置,可以将其设置为“To Files Pane Location”或“Choose Directory”from Other Folder。再次检查getwd()函数,可以发现目录已经更改。

> getwd()

[1] "E:/Home/MicrobiomeStatR/Analysis"

通过输入以下命令,可以将工作目录设置回file pane folder:

> setwd("*/")

在RStudio中,还可以选择“Session” —>“Set Working Directory”—>“To Files Pane Location” 去做同样的事情。

> getwd()

[1] "C:/Users/Yinglin"

如果目录中存储了R代码文件(例如,“Rcodes.R”),可以使用 source (Rcodes.R)访问文件“Rcodes.R”并运行该文件中包含的R代码。该文件应为纯文本文件,saved with the extension. R。打开RStudio时,都会转到默认目录。可以将默认设置更改为我希望数据文件所在的文件夹,这样就不必每次都这样做。在菜单中,选择Tools—>Global Options—>Default working

directory—> Browse—> 打开想要的数据文件所在的文件夹 —>选择文件夹。

③通过RStudio进行数据分析

RStudio的基本功能:RStudio允许用户在更友好的环境中运行R。RStudio屏幕通常由四个主要面板组成:source editor and data viewer; environment (workspace browser) and history; R console; and files, plots, packages, help and viewer.。大多数面板都有多个具有不同功能的表格。我们简要介绍每个面板及其基本功能,如下所示。

Source editor and data viewer:此面板位于左上角。它是用于编辑文件的源编辑器和用于查看数据帧的数据查看器。它的意图和用途与所有其他代码编辑器的主窗口相同。我们可以在这里写R脚本。有几种方法可以创建新的R脚本;最方便的方法是转到File—>New—>R Script。屏幕显示后,可以在那输入R命令。要运行R脚本,请单击右上角的“Run”按钮,或将光标放在命令所在行的任意位置,然后按Ctrl-R。输出将显示在下面的控制台中。“Source  on Save”复选框表示“每次保存文件时都将文件内容加载到控制台的运行时”。选中此框可使开发流程更快,只需单击一次。

R console:RStudio提供的R控制台面板位于左下角;其功能与大多数R控制台非常相似,例如,由Basic RGUI for Windows提供,可以在其中输入命令并查看输出。虽然可以在控制台输入命令,但它不是真正可重现的,因此不是一种有效的管理方式R脚本,建议使用源代码编辑器编写和管理R脚本。

Environment and history:environment and history 选项卡在右上角。environment选项卡指的是控制台环境,包括所有活动对象。此选项卡存储在R会话期间创建的任何对象、值、函数或任何内容。如果单击“数据”下面列出的数据集的任何名称,数据将显示在数据查看器屏幕的左侧“数据”。在这里,我们还可以手动导入数据集,并使其在控制台中立即可用。history 选项卡保存自上次项目启动以来执行的所有控制台命令。它将保存到项目文件夹中的隐藏.RHistory文件中。如果在会话后没有选择保存环境,则不会保存历史记录。这对测试是有帮助的。可以通过单击“To Source”按钮保存或选择命令并将它们发送到R脚本,或者通过单击“To Console”按钮将它们发送到R Console。

Files, plots, packages, help and viewer:右下角面板是包含五个独立选项卡的杂项面板。文件选项卡显示默认工作区中的所有文件和文件夹。Plots(绘图)选项卡将显示R会话期间的所有图形。在这里,我们可以缩放、导出、配置和检查图形/图形。最常用的可能是导出和保存图形。通过选择以下选项,可以导出和保存图形。

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.

当我们要创建文章质量的图形或在LaTeX文档中使用它时,前两个选项非常有用。第三个选项:复制和粘贴,可能是导出图形最简单的方法,也是Word文档中最常用的。Packages选项卡显示RStudio中安装的加载项软件包的列表。要将包加载到R中,需要检查它们。正如在前面介绍的,还可以通过单击“安装软件包”按钮来安装其他软件包。Help选项卡允许搜索有关R函数、数据集和包的内置文档。当调用?时,可以使用帮助选项卡。功能。当在控制台中输入问号后跟名称(例如,?data.frame)或在源代码编辑器中运行它时,有关命令名称(在本例中为数据框)的信息将自动打开。最后,查看器本质上是RStudio的内置浏览器。使用RStudio,可以通过Markdown轻松地开发HTML文档(网页)。查看器选项卡可以向显示从R Markdown创建的结果HTML文件。

用RStudio展示数据分析:在本节中将说明如何利用RStudio特性来创建 boxplot。使用的数据集hsb2demo可以在(https://stats.idre.ucla.edu/sas/output/regression-analysis/)上公开获得。数据集采用SAS数据格式,收集了200名高中生的数据,这些数据是各种测试的成绩,包括阅读、写作、数学、科学和社会研究。性别变量是一个二分法变量,如果学生是女性,则编码为1,如果是男性,则编码为0。此数据集包含200行和11个变量。以下是各列中的变量(按顺序)

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

展示了如何使用以下主要步骤创建按性别划分的boxplot

首先,下载数据集,并将其转换为CSV格式,并将其保存在以下目录中。还通过以下方式将工作目录设置为此目录:Choose “Session”—>“Set Working Directory” —> “To Source File Location”.

> setwd("E:/Home/MicrobiomeStatR/Analysis")

接下来,在RStudio中导入数据。有几种方法可以将数据导入到R/RStudio中,可以通过R函数或R包;将在下一节介绍一些广泛使用的方法。在这里,使用RStudio的导入数据集功能。要执行此操作,请执行以下步骤。

A.单击Environment 选项卡右上角面板中的“Import  DataSet”按钮。B.单击导入数据集对话框并选择选项(From csv….; From Excel….; From SPSS….; From SAS….; From Stata…)。在本例中,选择“From csv…“.C.浏览上面存储数据集hsb2demo的文件夹·D.点击“Open"—>Set Import Options(例如,分隔符、名称和其他参数的首选项)—>单击“Import”.

现在,数据集hsb2demo出现在左上角面板中以供查看。可以通过View()函数查看此数据集:View(hsb2demo) 或从Environment选项卡下的“Data”列表中单击hsb2demo的名称(如果没有出现)。然后,创建了一个按性别书写分数的boxplot。RStudio的一个非常有用的功能是其内置的R数据可视化工具。可以使用R函数(例如,本例中的boxlot()函数)创建绘图并将其可视化。

> #Boxplot of writing score by gender

> boxplot(write * female,data=hsb2demo, main="High School Students Data", xlab="Gender", ylab="Writing score by gender")

通过clicking Expor—>Copy to Clipboard—>Copy plot to clipboard—>Copy as: Bitmap—>Copy plot,paste it below:


使用RStudio创建绘图的示例

如果想要创建高质量的boxlot,可以使用ggplot2包,将在后面介绍这个包。要使用该软件包,需要安装ggplot2并通过调用库(ggplot2)将其加载到R/RStudio,或者在RStudio中 click Packages—>check the box near to ggplot2.

④数据导入和导出:数据分析的关键步骤之一是将特殊格式的数据导入R工作区。微生物组研究中最常见的数据格式是逗号分隔的文件、Excel电子表格、生物信息学分析生成的文件以及各种网站数据。R具有read.table()、read.csv()和read.csv2()、read.delim()等函数,可以将数据从文件导入到R工作区。在这里,我们介绍最常用的函数和工具。

Using read.table():首先,在介绍数据导入函数之前,先记下参数“string sAsFtors”。这是R中“data.frame()”函数的参数,该函数指示数据框中的字符串是应该被视为因子变量,还是应该仅被视为普通字符串。该参数也出现在“read.table()”和相关函数中,因为这些函数在读取表格数据并将其转换为数据框中扮演着重要角色。默认情况下,在像Read这样的函数中,“string sAsFators”被设置为true。table()、read.csv()、read.csv2()和read.delim()将包含字符串的列作为因子导入R。将字符串设置为因子的原因是告诉R将类别变量处理为单个虚拟变量,以便对lm()和glm()等函数进行建模。然而,在基因组学或微生物组研究中,将一列数据中的基因或分类群的名称编码为因子是没有意义的,因为它们本质上只是标签,不能用于任何建模功能。在这种情况下,可以将“string sAsFators”参数更改为false以更改默认设置。R函数read.table()以纯文本格式读取表,单元格由以下符号之一分隔:一个或多个空格(“”)、制表符、换行符或回车。例如,当字段用逗号分隔并且每行开始一个名称(通常由Excel创建的文本格式)时,可以使用函数read.table()将数据读入R工作区。

> tab <- read.table("genus.csv", header=TRUE,row.names=1, sep=",")

其中,参数为true或T表示文本文件“genus.csv”的第一个条目应该解释为变量名。参数row.ames=1表示第一列应该解释为行名,而不是变量,参数sep=“,”表示列之间用逗号分隔。

> tab <- read.table("genus.txt", header=TRUE,row.names=1, sep="\t")

参数sep=“\t”告诉R文件是制表符分隔的(使用“”表示文件是空格分隔的;使用“,”表示.csv文件中的逗号分隔)。如果表(例如,来自QIIME的OTU表)在标题前有一行,则需要指定 skip=1。如果标题行以#开头,则使用comment.char=“ ”读取它们。还可以访问当前文件夹之外的文件夹中的文件。例如,下面的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)

参数check.ames=F有两个原因。一种是告诉函数忽略重复的变量条目(即物种)。例如,对于微生物组数据,样本表可以包含几个同名的物种;另一个原因是告诉函数不要尝试修改物种的名称,以确保它们在语法上是正确的(否则,名称中的空格将被点号替换)。

Using read.delim():The read.delim()函数要求输入表为纯文本,单元格由制表符分隔或分隔。

> tab <- read.delim("genus.txt", header=T, row.names=1)

打开以制表符分隔的文件“genus.txt”。与read.delim()相比,可以看到read.table()在读取文件类型中提供了更多的控制,因为它可以读取.txt或.csv文件。它是更通用的函数read.table()的特定变体。

Using read.csv() and read.csv2():*.csv格式的文件在不同的国家和不同的平台上有不同的标准。在捷克语中,*.csv格式的文件的单元格用分号“;”分隔,小数位用逗号“,”分隔;而在西欧和其他地方,单元格用逗号“,”分隔,小数位用点“.”分隔。函数的作用是:读取表,用逗号“,”分隔,小数是点“.”。函数的作用是:读取由逗号“;”分隔的表格,其中小数是逗号“,”。我们使用函数read.csv()读取CSV文件,分隔符是逗号,小数点是点,如下所示

> tab <- read.csv('table.csv', head = T, row.names = 1,sep =',', dec = '.')

如果文件“table.csv”的单元格由分号“;”分隔,并且使用小数分隔的逗号“,”,则需要函数read.csv2()

> tab <- read.csv2 ('table.csv',head = T, row.names = 1, sep =';', dec = ',')

这类文件也可以使用read.table()函数读取。参数sep=‘;’将分隔符设置为分号,而dec=‘,’将小数分隔符设置为逗号。

> tab <- read.table (file = 'table.csv', head = T, row.names = 1, sep =';', dec = ',')

Using the gdata Package:Gdata包的read.xls()函数可以读取表格。该函数使用为脚本语言“Perl”开发的模块,因此需要安装Perl。函数的作用是:首先将指定的工作表转换为逗号分隔的文件,然后调用read.csv()函数。因此,它接受read.csv()函数的所有选项。这三个参数特别有用:the skip = 和header = arguments参数用于避免将标题和注释误解为数据,而as.is=TRUE参数可用于抑制因子转换。

> install.packages("gdata")

> library(gdata)

> tab <- read.xls("table.xlsx",sheet=1,header=TRUE)

如果尚未安装perl.exe文件,则上述R代码不可执行,并将给出一条错误消息。如果发生这种情况,需要下载perl.exe文件并将其保存在文件夹中。在对read.xls的调用中,按如下方式指定它(这是我的perl.exe所在的位置,请检查您的perl.exe,可能会有所不同)。

> tab <- read.xls("table.xlsx", sheet=1,perl="C:/Perl64/bin/perl.exe")

Using the XLConnect Package:有时,该文件被另存为Excel文件。可以直接从*.xls文件导入。包XLConnect可以从R内部读取、写入和操作Microsoft Excel文件。要使用此包,首先安装它。可以使用.xls和.xlsx文件格式。函数readWorksheetFromFile()将打开参数文件中指定的文件,并读取参数表指定的表。其他参数类似于read.table()函数。

> 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:在微生物组研究中,经常将分析结果导出或保存到外部文件中。基本工具是函数write.table()。它可以写出Excel可读的逗号分隔文件和记事本可读的文本文件。

> 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()的唯一必需参数是数据集或矩阵的名称。第二个参数file=用于将目的地指定为表示文件或连接的字符串。默认情况下,字符串用引号括起来。可以使用引号=FALSE或F来取消它。可以使用row.names=false或col.names=false参数分别禁止将行名或列名写入输出文件。还可以选择指定空格以外的分隔符。Sep=“\t”用于制表符分隔,sep=“,”用于逗号分隔。与函数read.csv()和read.csv2()类似,write.table()的替代函数是write.csv()和write.csv2()。它们有适当的选项可供设置,以生成逗号或分号分隔的文件。

⑤基本数据操作:本节中介绍一些基本的数据处理和操作技术,这些技术主要与数据框相关。数据框是长度相等的矢量列表。数据框是R处理数据的对象。它通常指的是“表格”数据:具有表示观测或测量的行(有时称为案例)和包含不同变量的值的列(通常称为字段)的数据结构。在微生物组研究中,病例可以是样本,字段可以是属、种、OTUS或任何分类水平。除了数据之外,数据框通常还包含一些元数据,例如行名和列名。类数据框的对象是R中处理表格统计数据的最重要的数据结构,默认的R安装有几个数据集,这里我们用著名的iris数据集来说明数据框的结构和对数据框的一些基本操作。iris数据框给出了分别来自3种iris(刚毛、杂色和处女花)各50朵花的变量萼片长度和宽度以及花瓣长度和宽度的测量结果(以厘米为单位)。因此,它有150个案例(行)和5个名为Sepal.Length、Sepal.Width、Petal.Length、Petal的变量(列)。宽度和物种。有关数据集的详细信息,请在R或RStudio中键入help(Iris)。

Structure of Data Frame:在R或RStudio中输入以下R代码来加载数据和前几行数据

> 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

这是一个数据框形式的表格。顶行称为“标题”,包含列名。之后的每个水平行都以该行的名称开头,然后是数据。每行和每列数据构成一个数据单元格。数据单元格可以通过方括号“[]”运算符进行检索:[行的位置,列的位置]。换句话说,坐标以行位置开始,然后是逗号,以列位置结束。

Create Data Frames:可以使用现有的数据框创建数据框。可以使用几种技术来实现它

> #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()手动创建数据框。

> #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:已经使用head()函数来预览数据框。

> head(iris)

默认情况下,R使用数据框作为对象,有时需要检查数据集,看看它是否是数据框。attributes()显示列名( col.names)、行名(row.names)和class,显示数据集是否为数据框。

> attributes(iris)

或者也可以使用class()函数检查数据集是否为数据框

> class(iris)

[1]"data.frame"

可以使用dim()函数检查行数和列数

> dim(iris)

[1] 150 5

可以使用nrow()和ncol()函数找到行数和列数

> nrow(iris)

[1] 150

> ncol(iris)

[1] 5

矢量的长度由下式给出

> length(iris[,"Species"])

[1] 150

可以使用rownames()和colnames()函数找到行名和列名。

> #check column or row names

> colnames(iris)

> rownames(iris)

可以使用print()函数print整个数据框

> print(iris)

如果只想print感兴趣的列而不是整个数据框,可以使用

> Species <- iris[,"Species"]

> Species

The cell value can be accessed by索引:

> iris[1,3]

[1] 1.4

或者,也可以使用行名和列名代替索引

> iris["1", "Petal.Length"]

[1] 1.4

与使用正整数编制索引不同,也可以使用不属于括号中给出的索引向量的负索引来访问单元格值。

> 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

检查微生物组数据的稀疏性:在微生物组研究中需要进行一些特殊的数据处理。正如第二章中所描述的那样微生物组数据的一个重要特征是零点多的稀疏性。为了检查下表中的稀疏性,使用下面的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

关于图形的几个函数:这里简要介绍ggplot2的概念和基础知识,以及图形的两个R函数:par()和Layout()。

函数 par () 的作用是:设置或查询图形参数。有许多图形参数可供使用,其中最常使用的是mar、mfcolo和mfrow。绘图边距的大小是以文本行为单位测量的。标记用于指定绘制绘图四边的线数中的页边距大小:C(下、左、上、右)。默认情况下,边距为PAR(mar=(c(5,4,4,2)+0.1))。参数mfrow和mfol用于控制同一页上有多少个图形。要记住这些函数的名称,可以认为它们代表“行中的多个框”(mfrow)或“列中的多个框”(mfcol)。我们可以使用par(mfrow)、par(mfcol)、par(layout)和par()split.screen)在同一图形设备上获得多个图形面板,但par(mfrow)经常使用。mfrow有两个参数:第一个参数用于指定图形的行数,第二个参数用于每行图形的列数。每个屏幕一个绘图的默认值是一行、一列:par(mfrow=c(1,1))。作为mfrow()或fig()的替代方法,可以使用layout()函数来配置多个绘图。通过使用此功能,可以独立更改多个绘图区的位置和形状,给出了layout函数的一种语法:

layout (matrix;widths= w;heights = h )

其中,矩阵是指定要在输出设备上绘制的n个图形的位置的矩阵对象,w是列宽矢量(with length = ncol(matrix)),h是行高矢量(with length = nrow(matrix))。函数layout.show(n)绘制n个图形的轮廓。例如使用Layout()在图的顶部绘制聚类树状图,在底部绘制堆叠的条形图,在右侧绘制图例。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()函数定义了三个图形的位置:图10.3是聚类树状图,希望将其放在三个框的顶部,图10.4是将位于左下角的堆叠条形图,图10.4的图例将在右侧绘制。

某些选项设置:选项设置允许设置和检查global options,以告诉R如何计算和显示其结果。参数width用于指定一行上要打印的最大列数,默认情况下为80;digits用于控制print数值时要print的有效位数。有效值为0…22,默认值为7。这两个参数可以一起使用,以确保输出中的换行符与页面宽度相对应。更好的做法是在R会话中设置相同的设置,例如,当开始新的R会话时,我们可以设置:

> options(width=65,digits=4)

⑥简单汇总统计信息:要获得有关R对象的概述,最有用的函数是Summary(),它提供基本汇总统计信息的集合。例如,可以对 iris数据集使用summary()函数

> 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

用于简单汇总统计的其他函数包括mean(), median(), min()和max()。经常可以看到它们与apply()函数结合使用,以获得矩阵或数组的每个维度的汇总统计信息。此函数的用法为apply((DATA, MARGIN, FUN, OPTION)。需要三个参数:data是数据框,包括要在其上执行操作的矩阵;margin是告诉Apply()要对哪个维度进行操作的索引,例如,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

用于汇总统计的apply()和其他函数在微生物组数据中有重要的应用。例如,以下代码使用apply()函数计算每个样本中每个分类单元(OTU)的丰度百分比

> tab_perc <- apply(tab, 2, function(x){x/sum(x)})

有时,分类单元丰度表的末尾有一个分类单元列;在这种情况下,需要使用−1索引来去掉它,然后计算百分比。

> tab_perc <- apply(tab[,1:ncol(tab)-1], 2, function(x){x/sum(x)})

对于微生物组数据分析,经常需要在分析前对每个样本的分类单元丰度进行过滤。例如,以下代码使用apply()函数去除任何百分比小于1%的样本中的分类群:

> tab_p1 <- tab[apply(tab_perc, 1, max)>0.01,]

以下代码用于在每个样本中保留频率>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

结合其他R函数,apply()函数也可用于过滤分类群(OTUs)。例如,以下代码将分界值设置为1,然后使用apply()、which()和mean()函数在所有样本中丢弃平均计数<=1的分类(OTUs):

> count <- 1

> tab_min <- data.frame(tab[which(apply(tab, 1, function(x){mean(x)}) >count),], check.names=F)

以下代码将分界值设置为0.5,然后使用apply()、whicht()和length()函数在一半或更多样本中有零的情况下丢弃分类(OTUs):

> cutoff = .5

> tab_d5 <- data.frame(tab[which(apply(tab, 1, function(x){length(which(x!= 0))/length(x)}) > cutoff),])

以下代码将中断值设置为500,然后使用apply()、which()和sum()函数丢弃总计数<500(行和<500)的分类(OTUs)

> count = 500

> tab_c500 <- data.frame(tab[which(apply(tab, 1, function(x){sum(x)})> count),])

⑦其他有用的R函数:

转换数据框:要转换iris数据框,使用t()函数

> #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:将这两个函数应用于iris数据框并创建一个新的数据框,然后将它们进行比较,如下所示

> #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的值按升序排序。要按降序排序,使用逆序函数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中的数字是介于1和150之间的索引。order()返回包含排列的索引的整数向量,该排列将对列进行升序排序。理解order()的最佳方法是认为x[order(x)]的结果与sort(x)的结果相同。因此,order()的以下两个应用程序与sort(iris_2$Sepal.Length)关于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()函数对于根据原始值重新编码变量非常有用,它完成两个操作:如果条件为真,则执行一项操作;如果条件为假,则执行另一项操作。好处是:在执行此操作时,该函数对整个向量执行操作,而不使用循环。例如,假设想要基于Petal.Length的值创建一个组:如果Petal.Length小于4,则group=1,否则group=2。

> group <- ifelse(iris$Petal.Length < 4,1,2)

该函数可以嵌套。回想一下,在iris数据集中,有三种:刚毛、杂色和维吉尼亚。下面的R代码为这三个物种创建了三个组

> group_s <- ifelse(iris$Species %in% "setosa",1,  ifelse(iris$Species %in% "versicolor",2,3))

使用strplit()拆分字符串:函数strplit()的作用是:根据从字符串中选择的子串,将字符向量的元素拆分成子字符串。一种语法是strplit(character string, split)。其中,第一个参数是要拆分的字符串或字符串的向量,拆分参数是要拆分字符串的字符子串。如果拆分为空字符串(“”),则在每个字符之间拆分字符串。函数strsplit()的作用是:输出已拆分的字符串的每个元素的列表。例如,使用的一个微生物组数据示例具有以下格式,行为样本,列为分类群。分组信息在示例字符串内

> 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)。以下代码实现了该目标

> 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()进行字符串模式匹配和替换:R提供了几个基于正则表达式的字符串搜索(或匹配)和替换函数。最常用的是grep()、sub()、gsub()。给出了简单的语法:grep(pattern, string)、sub(pattern, replacement,string)和gsub(pattern, replacement, string)。grep()在字符向量(第二个参数)中搜索匹配模式(第一个参数),而sub()和gsub()都执行匹配替换。参数字符串是一个字符向量。sub()和gsub()之间的区别在于:对于sub(),替换正则表达式的第一个出现,而对于gsub(),替换所有出现的正则表达式。这里展示了gsub()和grep()。请注意,R将sub()、gsub()和grep()中的第一个参数(Pattern)视为正则表达式,以提高字符串匹配、操作以及R代码编写和维护的效率。正则表达式描述函数的模式,说明“匹配”或“匹配和替换”字符串的内容和方式。正则表达式中的非字母数字符号/字符,如 “$”,“*”, “+”, “.”, “?”, “[”, “^”, “{”, “|”, “(”, “\\”称为元字符。元字符是正则表达式的构建块。它们是正则表达式中的特定含义。要将R中的任何元字符作为常规字符匹配,需要在它们之前加上双反斜杠“\\”进行转义,而将反斜杠作为常规字符匹配时,需要写四个反斜杠。例如,为了告诉gsub()函数将“$”解释为常规字符,在“$”前面加上一个双反斜杠。

> re <- gsub(pattern = "\\$", replacement = ".", "metacharacters$uses$in$regular$expressions")

> r e

[1] "metacharacters.uses.in.regular.expressions"


正则表达式中的一些元字符和特定含义

下面,函数gsub()将正则表达式\\.+解释为:匹配并替换句点的一个或多个重复项。

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

正则表达式经常出现在微生物组数据操作中。例如,公开可用的微生物组数据集“tongue_saliva”收集了舌头和唾液样本。舌样以td_开头,唾液以sa_开头。

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

要用单个有意义的名称分别标记这两个样本,例如“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"

数据集“tongue_saliva”还包括一个表示分类群信息的列“tax.0”。从数据集中获取它们。第一行显示分类单元名称以字符和“__”为前缀

> 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

为了更容易地操作数据,想要删除它们。可以使用gsub()函数来完成此工作:

> tax_1 <- gsub(".+__", "", tax)

> tax_1[1:3]

[1] "Neisseria"  "Capnocytophaga" "Actinomyces"

在上面的gsub()函数应用程序中,在正则表达式中使用元字符来匹配给定字符向量中的字符。grep()函数还接受正则表达式和字符串或字符串向量。默认情况下,它返回与正则表达式匹配的字符串元素的索引。如果指定了value=TRUE参数,则它返回与表达式匹配的实际字符串

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

如果希望字符串按原样匹配或按字面解释(即不是正则表达式),则使用fixed=TRUE参数

> grep("Width", c("Sepal.Length", "Sepal.Width", "Petal.Length","Petal.Width","Species"), value = TRUE,fixed =TRUE)

[1] "Sepal.Width" "Petal.Width"

使用rep()和grep()在微生物组数据中创建组变量:这些函数在微生物组数据中的一个重要用途是根据样本信息创建组变量。

Use rep() to create groups:

以下代码创建数值为1表示粪便(dryst)和2表示盲肠(CeSt)样本的变量组

> group <- data.frame(c(rep(1,length(grep("drySt", colnames(tab)))),  rep(2, length(grep("CeSt", colnames(tab))))))

以下代码创建了字符值为粪便表示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()函数获取包含两组粪便和盲肠样本的列。它在列标题中搜索并匹配以“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

上述样品不是分组订购的,也不是在实验条件下订购的。如果样本是基于组或实验条件排序的,则可以使用rep()函数创建组变量,如下所示

> 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 

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,230评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,261评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,089评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,542评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,542评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,544评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,922评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,578评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,816评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,576评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,658评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,359评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,920评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,859评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,381评论 2 342

推荐阅读更多精彩内容