第一章
典型的数据分析步骤:
1.导入数据
2.数据准备、探索和清理
3.拟合一个统计模型
4.评估模拟拟合结果
模型的交叉验证
5.在新数据上评估模型预测效果
6.形成报告
1.4 Packages
自定义启动环境可以设置,其中可以设置自动载入频繁使用的包。
> .libPaths()
[1] "C:/Users/zoe/Documents/R/win-library/3.3"
[2] "C:/Program Files/R/R-3.3.1/library"
能够显示库所在的位置
> library()
显示库中有哪些包
R自带了一系列默认包(base、datasets、utils、grDevices、graphics、stats以及methods)
> search()
告诉你哪些包已加载并可以使用
>install.packages("gclus")
安装一个新包gclus
>update.packages()
更新已经安装的包
>install.packages()
列出可以安装的包,版本号、以来关系等
>library(glus)
在当前会话中载入包glus
> help(package="stats")
输出包的简短描述性介绍,以及包中的函数名称和数据集名称的列表。
>help()
查看其中任意函数或数据集的细节
Eg.> help(AIC)查看stats包中的AIC函数
1.5 批处理
一种重复的、标准化的、无人值守的方式执行某个R程序。
不同的操作系统之下的批处理运行R的命令:
1.linux或Mac OS
在终端窗口中(Terminal)使用如下命令
R CMD BATCH options infile.R outfile.Rout
options是控制执行细节的选项;
infile是包含了要执行的R代码所在文件的文件名;
outfile是接收输出文件的文件名。
2.Windows
将路径调整为R.exe所在的相应的位置和脚本文件所在的位置。
“C:\Program Files\R\R-3.3.1\bin\R.exe" CMD BATCH --vanilla --slave "C:\my projects\myscript.R"
1.6 将输出用为输入——结果的重用
分析的结果保持后,作为进一步分析的输入使用
例如:lm(mpg~wt,data=mtcars)
对结果进行重用:
>lmfit<-lm(mpg~wt,data=mtcars)
>summary(lmfit)
>plot(lmfit)
>cook<-cooks.distance(lmfit)
>plot(cook)
>predict(lmfit,mynewdata)
>help(lm)
>?lm
查看lm包的说明文档的Value部分的内容,可以了解函数的返回值
1.打开帮助文档首页,并查阅其中的Introduction to R
2.安装vcd包
3.列出此包中的可用的函数和数据集
4.载入这个包
5.查看阅读Arthritis数据集的描述
6.显示数据集Arthritis中的内容
7.运行数据集自带的示例
8.退出
实践案例:
>help.start()
>install.packages("vcd")
>help(package="vcd")
>library(vcd)
>help(Arthritis)
>Arthritis
>example(Arthritis)
>q()
数据集:
统计学家称为观测 observation 和变量 variable
数据库分析师成为记录 record 和字段field
数据挖掘/机器学习学科的研究者称为示例 example 和属性 attribute
R中用于存储数据的结构有:标量、向量、矩阵、数组、数据框和列表。
R可以处理的数据类型(模式)包括数值型、字符型、逻辑型、复数型(虚数)和原生型(字节)。
Definitions:
对象object是指可以赋值给变量的任何事物,包括常量、数据结构、函数,甚至图形。
2.2.1 向量
向量是用于存储数值型、字符型或逻辑型数据的一维数组。
> c(1,2,3)
[1] 1 2 3
c( )函数创建向量。
单个向量中的数据必须拥有相同的类型或模式(数值型、字符型或逻辑型)。同一向量中无法混杂不同模式的数据。
标量是只含一个元素的向量。
> a<-1
> a
[1] 1
a为标量。
标量常常用以保存常量。
通过在方括号中给定元素所处位置的数值,可以访问向量中的元素。
> a<-c(1,2,5,3,6,-2,4)
> a[3]
[1] 5
> a[c(1,3,5)]
[1] 1 5 6
> a[2:6]
[1] 25 3 6 -2
> a[c(2,3,4,5,6)]
[1] 25 3 6 -2
以上两者等价
2.2.2 矩阵
矩阵是一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型)。
> zoesmatrix<-matrix(vector,nrow=number_of_rows,ncol=number_of_columns,byrow=logical_value,dimnames=list(char_vector_rownames,char_vector_colnames))
Matrix()函数创建矩阵。
vector包含了矩阵的元素;
nrow和ncol用以指定行和列的维数;
dimnames包含了可选的以字符型向量表示的行名和列名。
Byrow=TRUE 表明矩阵应当按行填充
Byrow=FALSE 表明矩阵应当按列填充(默认FALSE)
示例:创建矩阵
> y<-matrix(1:20,nrow=5,ncol=4)
> y
[,1] [,2] [,3] [,4]
[1,] 16 11 16
[2,] 27 12 17
[3,] 38 13 18
[4,] 49 14 19
[5,] 510 15 20
> cells<-c(1,26,24,68)
> rnames<-c("R1","R2")
> cnames<-c("C1","C2")
> mymatrix<-matrix(cells,nrow=2,ncol=2,byrow=FALSE,dimnames=list(rnames,cnames))
> mymatrix
C1 C2
R1 1 24
R2 26 68
> mymatrix<-matrix(cells,nrow=2,ncol=2,byrow=TRUE,dimnames=list(rnames,cnames))
> mymatrix
C1 C2
R1 1 26
R2 24 68
示例:矩阵下标的使用
> x<-matrix(1:10,nrow=2)
> x
[,1] [,2] [,3] [,4] [,5]
[1,] 13 5 79
[2,] 24 6 810
> x[2,]
[1] 24 6 8 10
> x[,2]
[1] 3 4
> x[1,4]
[1] 7
> x[1,c(4,5)]
[1] 7 9
矩阵都是二维的,和向量类似,矩阵中也仅能包含一种数据类型。
当维度超过2时,不防使用数组。
2.2.3 数组
数组array与矩阵类似,但是维度可以大于2。
数组可以通过arrary()函数创建:
Myarray<-array(vector,dimensions,dimnames)
其中vector包含了数组中的数据;
dimensions是一个数值型向量,给出了各个维度下标的最大值;------是一个向量
dimnames是可选的、各维度名称标签的列表。
示例:创建数组
> dim1<-c("A1","A2")
> dim2<-c("B1","B2","B3")
> dim3<-c("C1","C2","C3","C4")
> z<-array(1:24,c(2,3,4),dimnames=list(dim1,dim2,dim3))
> z
, , C1
B1 B2 B3
A1 13 5
A2 24 6
, , C2
B1 B2 B3
A1 7 9 11
A2 8 10 12
, , C3
B1 B2 B3
A1 13 15 17
A2 14 16 18
, , C4
B1 B2 B3
A1 19 21 23
A2 20 22 24
> z[1,2,3]
[1] 15
从数组中选取元素的方式与矩阵相同。
数组和矩阵一样,只能拥有一种模式。
2.2.4 数据框
数据框是在R中最常处理的数据结构。
通常与在SAS,SPSS,Stata中看到的数据集类似。
由于数据有多种模式,无法将数据集放入一个矩阵中,使用数据框是最佳选择。
数据框创建函数:data.frame()
mydata<-data.frame(col1,col2,col3,...)
Col1,col2,col3…可以为任何类型,每一列的名称可以由函数names()指定。
示例:创建一个数据框
> patientID<-c(1,2,3,4)
> age<-c(25,34,28,52)
> diabetes<-c("Type1","Type2","Type1","Type1")
> status<-c("Poor","Improved","Excellent","Poor")
> patientdata<-data.frame(patientID,age,diabetes,status)
> patientdata
patientID age diabetes status
1 125 Type1 Poor
2 234 Type2 Improved
3 328 Type1 Excellent
4 452 Type1 Poor
实例标识符case identifier
实例标识符case identifier可以通过数据框操作函数中的rowname选项指定。
实例标识符为标记各类打印输出和图形中实例名称所用的变量。
例如:
> patientdata<-data.frame(patientID,age,diabetes,status,row.names=patientID)
示例:选取数据框中的元素
> patientdata[1,2]
[1] 25
> patientdata[1:2]
patientID age
1 125
2 234
3 328
4 452
> patientdata[c("diabetes","status")]
diabetesstatus
1 Type1Poor
2 Type2Improved
3 Type1 Excellent
4 Type1Poor
> patientdata$age
[1] 25 34 28 52
$被用来选取一个给定的数据框中的某个特定变量。
例如:生成diabetes和status的列联表,使用以下代码即可:
> table(patientdata$diabetes,patientdata$status)
Excellent Improved Poor
Type11 0 2
Type20 1 0
创建列联表函数 table()
扩展:组合使用attach()、detach();或单独使用with()函数简化代码,减少使用$.
函数attach()可将数据框添加到R的搜索路径中,函数detach()将数据框从搜索路径中移除。
R在遇到一个变量名后,将检查搜索路径中的数据框,以定位到这个变量。
示例:两段命令等价。
> summary(mtcars$mpg)
Min. 1st Qu.Median Mean 3rd Qu. Max.
10.4015.42 19.20 20.0922.80 33.90
> plot(mtcars$mpg,mtcars$disp)
> plot(mtcars$mpg,mtcars$wt)
简化写法:
> attach(mtcars)
> summary(mpg)
Min. 1st Qu.Median Mean 3rd Qu. Max.
10.4015.42 19.20 20.0922.80 33.90
> plot(mpg,disp)
> plot(mpg,wt)
> detach(mtcars)
Detach()函数本身不对数据框做任何处理。
在数据框mtcars被attach绑定之前,如果环境中已经有一个名为mpg的对象,这种情况下,原始对象将取得优先权。
故,attach()和detach()最好在分析一个单独的数据框时使用,并且不太可能有多个同名对象同时使用。
With()
> with(mtcars,{
+ summary(mpg,disp,wt)
+ plot(mpg,disp)
+ plot(mpg,wt)
+ })
在这种情况下,大括号{}之间的语句都针对数据框mtcars执行,这样就无须担心名称冲突了。如果仅有一条语句(例如:
> with(mtcars,summary(mpg))
Min. 1st Qu.Median Mean 3rd Qu. Max.
10.4015.42 19.20 20.0922.80 33.90
则可以省略{}。)
局限性:赋值仅在此函数的括号内生效。
如果需要创建with()结构以外存在的对象,使用特殊赋值符<<-替代标准赋值符<-即可,它可将对象保存到with()之外的全局环境中。
> with(mtcars,{
+ nokeepstats<-summary(mpg)
+ keepstats<<-summary(mpg)
+ })
> nokeepstats
错误: 找不到对象'nokeepstats'
> keepstats
Min. 1st Qu.Median Mean 3rd Qu. Max.
10.4015.42 19.20 20.0922.80 33.90
2.2.5 因子
变量分为名义型、有序型或连续型变量。
类别(名义型)变量和有序类别(有序型)变量在R中称为因子factor
因子在R中非常重要,因为它决定了数据的分析方式以及如何进行视觉呈现。
函数factor()以一个整数向量的形式存储类别值,整数的取值范围是[1…k](其中k是名义型变量中唯一值得个数),同时一个由字符串(原始值)组成的内部向量映射到这些整数上。
> patientdata<-data.frame(patientID,age,diabetes,status,row.names=patientID)
> diabetes<-c("Type1","Type2","Type1","Type1")
> diabetes<-factor(diabetes)
> diabetes
[1] Type1 Type2 Type1 Type1
Levels: Type1 Type2
> diabetes<-c("Type1","Type2","Type1","Type1")
> diabetes1<-factor(diabetes,ordered=TRUE)
> diabetes1
[1] Type1 Type2 Type1 Type1
Levels: Type1 < Type2
> diabetes2<-factor(diabetes,order=TRUE,levels=c("Type2","Type1"))
> diabetes2
[1] Type1 Type2 Type1 Type1
Levels: Type2 < Type1
#此实例显示结果与书上不同,应该是函数表现形式发生变更。
实例:因子的使用
> patientID<-c(1,2,3,4)
> age<-c(25,34,28,52)
> diabetes<-c("Type1","Type2","Type1","Type1")
> status<-c("Poor","Improved","Excellent","Poor")
> diabetes<-factor(diabetes)
> status<factor(status,order=TRUE)
[1] FALSE FALSE FALSE FALSE
> patientdata<-data.frame(patientID,age,diabetes,status)
> str(patientdata) #显示对象的结构
'data.frame': 4 obs. of4 variables:
$ patientID: num 1 2 3 4
$ age: num 25 34 28 52
$ diabetes : Factor w/ 2 levels "Type1","Type2": 1 2 1 1
$ status: Factor w/ 3 levels "Excellent","Improved",..: 3 2 1 3
> summary(patientdata)
patientID age diabetes status
Min.:1.00 Min. :25.00Type1:3 Excellent:1
1st Qu.:1.751st Qu.:27.25 Type2:1 Improved :1
Median :2.50Median :31.00Poor :2
Mean:2.50 Mean :34.75
3rd Qu.:3.253rd Qu.:38.50
Max.:4.00 Max. :52.00
2.2.6 列表
列表list是R的数据类型中最为复杂的一种。
一般来说,列表就是一些对象object(或成分component)的有序集合。
列表允许整合若干个对象到单个对象名下。
例如:某个列表中可能是若干向量、矩阵、数据框,甚至其他列表的组合。
创建列表:list()函数
> mylist<-list(object1,object2,...)
其中的对象可以是任何结构
> mylist<-list(name1=object1,name2=object2,...)
示例:创建列表
> head<-"My First List"
> h<-c(25,26,18,39)
> j<-matrix(1:10,nrow=5)
> k<-c("one","two","three")
> mylist<-list(title=head,age=h,j,k)
> mylist
$title
[1] "My First List"
$age
[1] 25 26 18 39
[[3]]
[,1] [,2]
[1,] 16
[2,] 27
[3,] 38
[4,] 49
[5,] 510
[[4]]
[1] "one" "two" "three"
> mylist[[2]]
[1] 25 26 18 39
> mylist[["ages"]]
NULL
> mylist[["age"]]
[1] 25 26 18 39
可以通过在双重方括号中[] 指明代表某个成分的数字或名称来访问列表中的元素。
上述两个例子均指那个含有四个元素的向量。
首先,列表允许以一种简单的方式组织和重新调用不相干的信息。
其次,许多R函数的运行结果都是以列表的形式返回的。
注意事项:
1.对象名称中的句点(.)没有特殊意义。
美元符号$和其他语言中(.)有着类似的意义,即指定一个对象中的某些部分。
2.R不提供多行注释或块注释功能。
以#作为多行注释每行的开始。
也可以把想让解释器忽略的代码放到语句if(FALSE){…}中;
if{TRUE}(…)即代表允许这块代码执行。
3.R中没有标量,标量以单元素向量的形式出现。
4.R中的下标不从0开始,而从1开始。
5.变量无法被声明,它们在首次被赋值时生成。
6.将一个值赋值给某个向量、矩阵、数组或列表中一个不存在的元素时,R将自动扩展这个数据结构以容纳新值。
> x<-c(8,6,4)
> x[7]<-10
> x
[1] 86 4 NA NA NA 10
通过赋值,向量x由三个元素扩展到了七个元素。
> x<-x[1:3]
> x
[1] 8 6 4
重新赋值后回归。
2.3 数据的输入
R可从键盘、文本文件、MS Excel和Access、流行的统计软件、特殊格式的文件,以及多种关系型数据中导入数据。
可供R导入的数据源:
文本文件:ASCII、XML
数据库管理系统:SQL、MySQL、Oracle、Access
统计软件:SAS、SPSS、Stata
键盘:
其他:Excel、netCFD、HDFS
2.3.1 使用键盘输入数据
函数edit() 会自动调用一个允许手动输入数据的文本编辑器。
> mydata<-data.frame(age=numeric(0),gender=character(0),weight=numeric(0))
> mydata<-edit(mydata)
具体步骤:
1.创建一个空数据框或矩阵,其中变量名和变量的模式需与理想中最终数据集一致;
2.针对这个数据对象调用文本编辑器,输入你的数据,并将结果保存回此数据对象中。
上述实例中,age(数值型),gender(字符型),weight(数值型)
类似于age=numeric(0)的赋值语句将创建一个指定模式但不含实际数据的变量。
语句mydata<-edit(mydata) 等价于fix(mydata)
2.3.2 从带分隔符的文本文件导入数据
使用read.table()函数从带分隔符的文本文件中导入数据。
语法:mydataframe<-read.table(file,header=logical_value,sep="delimiter",row.name="name")
其中file是一个带分隔符的ASCII文本文件,header是一个表明首行是否包含了变量名的逻辑值(TRUE OR FALSE),sep是用来指定分隔数据的分隔符,row.names是一个可选参数,用以指定一个或多个表示行标识符的变量。
示例:> grades<-read.table("studentgrades.csv",header=TRUE,sep=",",row.names="STUDENTID")
注意:参数sep默认值为sep=“”,即表示分隔符可以是一个或多个空格,制表符,换行符或者回车符。
以制表符分隔:sep="\t"
已逗号分隔:sep=","
默认情况下,字符型变量将转换为因子。设置选项stringAsFactors=FALSE可以停止对所有字符型变量的转换。
另一种方法是使用选项colClasses为每一列指定一个类,例如logical,numeric,character,factor.
函数read.table()其余的微调数据选项参阅help(read.table).
注意:函数file(),gefile(),bzfile(),xzfile(),unz(),url()可作为文件名参数使用。
函数file()允许用户访问文件、剪贴板和C级别的标准
函数gzfile(),bzfile(),xzfile(),unz()允许用户读取压缩文件。
函数url()能够通过含有http://,ftp://或file://的完成的URL访问网络上的文件,还可以为HTTP和FTP连接指定代理。
Usage
file(description = "", open = "", blocking = TRUE,
encoding =
getOption("encoding"), raw = FALSE,
method = getOption("url.method",
"default"))
url(description,
open = "", blocking = TRUE,
encoding =
getOption("encoding"),
method =
getOption("url.method", "default"))
gzfile(description,
open = "", encoding = getOption("encoding"),
compression = 6)
bzfile(description,
open = "", encoding = getOption("encoding"),
compression = 9)
xzfile(description,
open = "", encoding = getOption("encoding"),
compression = 6)
unz(description, filename, open = "", encoding = getOption("encoding"))
pipe(description, open = "", encoding = getOption("encoding"))
fifo(description,
open = "", blocking = FALSE,
encoding =
getOption("encoding"))
socketConnection(host
= "localhost", port, server = FALSE,
blocking = FALSE, open =
"a+",
encoding = getOption("encoding"),
timeout =
getOption("timeout"))
2.3.3 导入Excel数据
方法1:将Excel文件导出为一个逗号分隔文件(csv),并使用read.table()的方式导入;
方法2:在Windows系统中,使用RODBC包来访问Excel文件。
电子表格的第一行应当包含变量/列的名称。
> install.packages("RODBC")
> library(RODBC)
> channel<-odbcConnectExcel("myfile.xls")#读取文件
> mydataframe<-sqlFetch(channel,"mysheet")#选取表单
> odbcClose(channel)
这里的myfile.xls是一个Excel文件,mysheet是要从这个工作薄中读取工作表的名称,channel是一个由odbcConnectExcel()返回的RODBC连接对象,mydataframe是返回的数据框。
> A<-odbcConnectExcel("DATE DATA.xls")
|
Error in odbcConnectExcel("DATE DATA.xls") : |
|
odbcConnectExcel is only usable with 32-bit Windows |
实际情况是,该函数目前只支持32位Windows电脑。
方法3:使用xlsx包来导入数据
XLSX文件本质上是多个XML文件组成的压缩包,xlsx包可以用来读取这种格式的表格。
最简单的调用格式为:read.xlsx(file,n)
File为路径,n为要导入的工作表序号。
例如:mydata<-read.xlsx("D:/R/DATE DATA.xlsx",1)
扩展:xlsx包不仅可以导入数据表,还能够创建和操作XLSX文件。
方法4:剪贴板
Mydata<-read.table("clipboard",header=T)
方法5:使用openxlsx包
>install.packages("openxlsx")
>library(openxlsx)
>data<-read.xlsx("DATE DATA.xlsx")
尝试过程中唯一不报错的
方法6:使用readxl包
> install.packages("readxl")
> library(readxl)
> data<-read_excel("DATE DATA.xlsx")
> data2<-read_excel("DATE DATA.xls")
> data2<-read_excel("DATE DATA.xls",sheet=1)
> data2<-read_excel("DATE DATA.xls",sheet=1,na="NA")
> data<-read_excel("DATE DATA.xlsx",sheet=sheet1,na="NA")
> data<-read_excel("DATE DATA.xlsx",sheet="约会高级查找视图",na="NA")
2.3.4 导入XML数据
XML包允许用户读取、写入和操作XML文件。
2.3.5 从网页抓取数据
Webscraping网页抓取数据。
一种方法:使用函数readLines()下载网页,然后使用如grep()和gsub()一类的函数处理它。
对于结构复杂的网页,可以使用RCurl包和XML包来提取其中想要的信息。
Programming with R(www.programmingr.com) find "Webscraping using readLines and Rcurl"
2.3.6 导入SPSS数据
通过foreign包中的函数read.spss()导入;
使用Hmisc包中的spss.get()函数;
函数spss.get()是对read.spss()的一个封装,它可以自动设置read.spss()的很多参数,让整个转换过程更加简单一致。
> library(ggplot2)
> library(survival)
> library(lattice)
> library(Hmisc)
> mydataframe<-spss.get("mydata.sav",use.value.labels=TRUE)
# use.value.labels=TRUE表示让函数将带有值标签的变量导入为R中水平对应相同的因子。
2.3.6 导入SAS数据
1.使用foreign包中的read.ssd()
2.使用Hmisc包中的sas.get()
3.将SAS文件转化为逗号分隔文本文件,使用实用read.table()函数读取。
示例:
SAS程序:proc export data=mydata
outfile="mydata.csv"
dbms=csv;
Run;
R程序:mydata<-read.table("mydata.csv",header=TRUE,sep=",")
2.3.8 导入Stata数据
> install.packages("foreign")
> library(foreign)
2.3.9 导入netCDF数据
Unidata项目主导的开源软件库netCDF(network Common Data Form,网络通用数据格式)定义了一种机器无关的数据格式,可用于创建和分发面向 数组 的科学数据。
netCDF格式通常用来存储 地球物理数据。
ncdf包河ncdf4包为netCDF文件提供了高层的R接口。
> library(ncdf)
> nc<-nc_open("mynetCDfile")
> myarrry<-get.var.ncdf(nc,myvar)
2.3.10 导入HDF5数据
HDF5(Hierarchical Data Format)分层数据格式,是一套用于管理超大型和结构极端复杂数据集的软件技术方案。
包hdf5可以用来读取HDF5格式的文件。
2.3.11 访问数据库管理系统
R中有许多面向关系型数据库管理系统DBMS的接口,包括MS SQL Server、MS Access、MySQL、Oracle、PostgreSQL、DB2、Sybase、Teradata以及SQLite。
其中一些包通过原生的数据库驱动来提供访问功能,另一些则是通过ODBC或JDBC来实现访问。
使用R来访问存储在外部数据库中的数据是一种分析大数据集的有效手段,并且能够发挥SQL和R各自的优势。
附录G内容:处理大数据集
R将所有的对象都存储在虚拟内存中。
优点:很好的交互体验;
缺点:处理大型数据,影响程序的运行速度,带来和内存相关的错误。
错误:具体的内容限制取决于R的版本(32位或62位)和所使用的操作系统。
以cannot allocate vector of size开头的错误信息通常都是因为无法获得足够的连续内存空间;
以cannot allocate vector of length开头的错误信息表示超过了内存地址的限制。
在处理大型数据时,应该尽可能地用64位版。
无论什么版本,单个向量中元素数量的上限都是2 147 483 647 (21亿)
详情:
> ?Memory
starting httpd help server ... done
在处理大数据时,要注意以下三个问题:
1.高效执行的程序
2.将数据保存到外部避免内容问题
3.用有针对性的统计方法高效地分析海量数据
1.高效程序设计
a.尽可能地作向量化计算。用R内建的函数来处理向量、矩阵和列表(例如:sapply,lapply,mapply),而且要尽量避免使用循环(for和while);
b.用矩阵,二不是数据框(矩阵更轻量级)
c.在使用read.table()系统函数将外部数据读取到数据框中,明确的指定colClasses和nrows,设置comment.char=" ",并且用"NULL"标明不需要的列。
这可以降低内存的使用量,显著地提高处理速度。
将外部数据读入矩阵时,可以用scan()函数。
d.在完整的数据集上运行程序之前,请先用数据的子集测试程序,以便优化代码并消除bug。
e.删除临时对象和不再需要的对象
调用rm(list=ls())删除内存中所有对象。
删除特定对象rm(object)
f.函数.ls.objects()可以使工作空间中的所有对象按照大小MB排列,以便找到内存消耗的大户。
g.测试程序中每个函数所消耗的时间。
用Prof()和summaryRprof()函数就可以完成测试。
函数system.time()也可以用上。
包profr和包prooftools提供用于分析测试结果的函数。
h.如果需要进一步优化代码的话,Rcpp包可以将R对象转换成C++函数。
2.在内存外存储数据
有好几个包可以将数据保存到R的主内存之外。
主要的方法是将数据保存到外部数据库中,或是硬盘上的二进制文件中,然后再将需要访问其中的某个部分。
以下是用于访问大型数据集的R包
包ff ——提供了一种数据结构,可以将数据保存到硬盘上,但用起来却像是在内存中
包bigmemory ——支持大型矩阵的创建、存储、访问和操作。矩阵可以分配在共享内存和内存映射文件中
包filehash ——实现了一个简单的key-value数据库,用字符串的键值关联到硬盘上存储的数据值
包ncdf,ncdf4 ——提供了Unidate netCDF数据文件的接口
包RODBC,RMySQL,ROracle,RPostgreSQL,RSQLite ——每一个都可以用于访问相应的外部关系型数据库管理系统
3.用于大数据的分析包
包:biglm和speedglm能以内存高效的方式实现大型数据的线性模型拟合和广义线性模型拟合。
有好几个包是用来分析bigmemory包生成的大型矩阵的。biganalytics包提供了k均值聚类、列统计和一个biglm的封装。bigtabulate包提供了table(),split()和tapply()功能;bigalgebra包提供了高级的线性代数函数。
包biglars和ff包配合使用,为在内存中无法安置的大数据提供了最小角回归least_angle regression,lasso和逐步回归分析。
包Borbdingnag可以处理大数字(大于2的1024次方的数)。
在任何编程语言中,处理GB级和TB级的数据都是挑战。
1.ODBC接口
通过ODBC包访问一个数据库是最流行的方式,可以连接到任意一种有ODBC驱动的数据库,几乎涵盖市面上所有的数据库。
第一步是针对你的系统和数据库类型安装和配置合适的ODBC驱动。
配置好驱动后,安装ODBC包。
RODBC包中的主要函数有以下几种:
odbcConnect(dsn,uid=" ",pwd=" ") ——建立一个到ODBC数据库的链接
sqlFetch(channel,sqltable) ——读取ODBC数据库中的某个表到一个数据框中
sqlQuery(channel,query) ——向ODBC数据库提交一个查询并返回结果
sqlSave(channel,mydf,tablename=sqtable,append=FALSE) ——将数据框写入或更新(append=TRUE)到ODBC数据库的某个表中
sqlDrop(channel,sqtable) ——删除ODBC数据库中的某个表
close(channel) ——关闭连接
RODBC包允许R和一个通过ODBC连接的SQL数据库之间进行双向通信,这意味着一方面可以读取数据库中的数据到R中,另一方面,也可以使用R修改数据库中的内容。
> install.packages("RODBC")
> library(RODBC)
> myCRMdata<-odbcConnect("MyCRM",uid="xxzhuli",pwd="740465595")
> YAOYUEMINGLU<-sqlFetch(myCRMdata,yaoyueminglu)
>QIANZAIKEHU<-sqlQuery(myCRMdata,"select * from qianzaikehu")
>close(myCRMdata)
对于数据库CRM中的数据中的yaoyueminglu和qianzaikehu两张表分别导入为R的两个名为YAOYUEMINGLU和QIANZAIKEHU的数据框。
安装载入RODBC包后,通过一个数据源名称MyCRM,用户名xxzhuli,密码:********打开了一个ODBC数据库连接。
连接字符串被传递给sqlFetch,它将yaoyueminglu表复制到R数据框YAOYUEMINGLU中。
然后我们对QIANZAIKEHU表执行SQL语句select并将结果保存到数据框pundat中。
最后,关闭连接。
sqlQuery函数非常强大,因为其中可以插入任意的有效SQL语句。
这种灵活性赋予了用户选择指定变量,对数据取子集,创建新变量,以及重编码和重命名现有变量的能力。
2.BDI相关包
DBI包为访问数据库提供了一个通用且一致的客户端接口。
构建于这个框架之上的RJDBC包提供了通过JDBC驱动访问数据库的方案。
使用时请确保安装了针对使用的系统和数据库的表要JDBC驱动。
其中有用的、基于DBI的包邮RMySQL,Roracle,RPostgreSQL,RSQLite。
这些包都为对应的数据库提供了原生的数据库驱动,但可能不是在所有系统上都可用。
2.3.12 通过Stat/Transfer导入数据
Stat/Transfer(www.stattransfer.com)是一款可在34中数据格式之间做转换的独立应用程序。
2.4 数据集的标注
2.4.1 变量标签
R处理变量标签的能力有限。
解决方法:建议将变量标签作为变量名,然后通过位置下标来访问这个变量。
2.4.2 值标签
函数factor()可为类别型变量创建值标签。
示例:
> patientdata$gender<-factor(patientdata$gender,levels=c(1,2),labels=c("male","female"))
levels代表变量的实际值,而labels表示包含了理想值标签的字符型向量。
2.5 处理数据对象的实用函数
处理数据对象的实用函数:
显示对象中元素/成分的数量length(object)
显示某个对象的维度 dim(object)
显示某个对象的结构 str(object)
显示某个对象的类或类型 class(object)
显示某个对象的模式 mode(object)
显示某对象中各成分的名称 names(object)
将对象合并并入一个向量c(object,object,…)
按列合并对象 cbind(object,object,…)
按行合并对象 rbind(object,object,…)
输出某个对象 Object
列出某个对象的开始部分 head(object)
列出某个对象的最后部分 tail(object)
显示当前的对象列表 ls()
删除一个或更多个对象rm(object,object,…)
删除当前工作环境中几乎所有对象rm(list=ls())
编辑对象并另存为newobject newobject<-edit(object)
直接编辑对象 fix(object)
第3章
本章内容:
图形的创建和保存
自定义符号、线条、颜色和坐标轴
标注文本和标题
控制图形维度
组合多个图形
3.1 使用图形
R是一个惊艳的图形构建平台。
在通常的交互式会话中,可是通过逐条输入语句构建图形,逐渐完善图形特征,直至得到想到的效果。
> attach(mtcars)
> plot(wt,mpg)
> abline(lm(mpg~wt))
> title("Regression of MPG on Weight")
> detach(mtcars)
可以通过代码或图形用户界面来保存图形。
要通过代码保存图形,将绘图语句夹在开启目标图形设备的语句和关闭目标图形设备的语句之间即可。
例如:以下代码会将图形保存到当前工作目录中名为mygraph.pdf的PDF文件中:
> pdf("mygraph.pdf")
> attach(mtcars)
> plot(wt,mpg)
> abline(lm(mpg~wt))
> title("Regression of MPG on Weight")
> detach(mtcars)
> dev.off()
除了pdf(),还可以使用函数win.metafile(),png(),jpeg(),bmp(),tiff(),xfig()和postscript()将图形保存为其他格式。
在Windows上,在图形窗口中选择“文件”->“另存为”,然后在弹出的对话框中选择想要的格式和保存位置即可。
在Mac上,当Quartz图形窗口处于高粱时,点选菜单栏中的”文件“->"另存为”即可。其提供的输出格式仅有PDF。
在UNIX系统中,图形必须使用代码来保存。
创建多个图形并随时查看每一个图形,并不覆盖先前的图形。
方法:
1.在创建一幅新图形之前打开一个新的图形窗口:
dev.new()
statements to create graph 1
dev.new()
statements to create a graph 2
etc.
2.可以通过图形用户界面来查看多个图形。
在windows上通过历史 --记录使用上一个下一个来逐个查看已经绘制的图形。
3.使用函数dev.new(),dev.next(),dev.prev(),dev.set()和dev.off()同时打开多个图形窗口,并选择将哪个输出发送到哪个窗口中。
这个方法全平台适用。help(dev.cur)
3.2 一个简单的例子
> dose<-c(20,30,40,45,60)
> druga<-c(16,20,27,40,60)
> drugb<-c(15,18,25,31,40)
> plot(dose,druga,type="b")
函数plot()是R中为对象作图的一个泛型函数(它的输出将根据所绘制对象类型的不同而变化)。
选项type="b"表示同时绘制点和线。
- help(plot)
## Discrete Distribution Plot:
plot(table(rpois(100, 5)), type = "h", col = "red", lwd = 10,
main = "rpois(100, lambda = 5)")
## Simple quantiles/ECDF, see ecdf() {library(stats)} for a better one:
plot(x <- sort(rnorm(47)), type = "s", main = "plot(x, type = \"s\")")
points(x, cex = .5, col = "dark red")
- type参数
•"p" for points, 绘制点
•"l" for lines, 仅绘制线
•"b" for both, 同时绘制点和线。
•"c" for the lines part alone of "b",
•"o" for both ‘overplotted’, 线加空心圆
•"h" for ‘histogram’ like (or ‘high-density’) vertical lines, 竖线
•"s" for stair steps, 楼梯式
•"S" for other steps, see ‘Details’ below, 高的楼梯式
•"n" for no plotting. 没有线没有点
- 其余参数:
main:
an overall title for the plot: see title. 主标题
sub:
a sub title for the plot: see title. 子标题
xlab:
a title for the x axis: see title. x轴标签
ylab:
a title for the y axis: see title.y轴标签
asp:
the y/x aspect ratio, see plot.window. y/x长宽比
3.3 图形参数
我们可以通过修改图形参数的选项来自定义一幅图形的多个特征(字体、颜色、坐标轴、标题)。
方法一:通过函数par()来指定这些选项。
以这种方式设定的参数值除非被再次修改,否则将会在会话结束前一直有效。
调用格式:par(optionname=value,optionname=name,…)
不加参数地执行par()将生成一个含有当前图形参数设置的列表。
添加no.readonly=TRUE可以生成一个可以修改的当前图形参数列表。
实例:
> dose<-c(20,30,40,45,60)
> druga<-c(16,20,27,40,60)
> drugb<-c(15,18,25,31,40)
> opar<-par(no.readonly=TRUE)#生成一个可有修改的当前图形参数列表,复制了一份当前的图形参数设置
> par(lty=2,pch=17)
> plot(dose,druga,type="b")
> par(opar)#还原原始设置
等价于:>plot(dose,druga,type="b",lty=2,pch=17)
并不是所有的高级绘图函数都允许指定全部可能的图形参数。
实践中需要参考每个特定的绘图函数的帮助?plot ,?hist , ?boxplot以确定哪些参数可以以这种方式设置。
3.3.1 符号和线条
用于指定符号和线条类型的参数:
指定绘制点时使用的符号 |
|
|
|
|
|
|
|
|
pch |
指定符号的大小。cex是一个数值,表示绘图符号相对于默认大小的缩放倍数。默认大小为1, 1.5表示放大为默认值的1.5倍。 |
|
cex |
指定线条类型 |
|
lty |
指定线条宽度。lwd是以默认值得相对大小来表示的,默认值为1。 |
|
lwd |
对于参数pch中的符号21~25,还可以指定边界颜色(col=)和填充色(bg=)
对于参数lty可指定的线条类型有1~6,累计六种,1为实线,其余为各种类型的虚线
用于指定颜色的参数:
默认的绘图颜色 |
|
|
|
|
|
|
|
|
|
col |
坐标轴刻度文字的颜色 |
|
|
|
|
|
|
|
|
|
col.axis |
坐标轴标签(名称)的颜色 |
|
|
|
|
|
|
|
|
|
col.lab
|
标题颜色 |
|
|
|
|
|
|
|
|
|
col.main |
副标题颜色 |
|
|
|
|
|
|
|
|
|
col.sub |
图形的前景色 |
|
|
|
|
|
|
|
|
|
fg |
图形的背景色 |
|
|
|
|
|
|
|
|
|
bg |
参数col,在某些函数,如lines(), pie()可以接受一个含有颜色值的向量并自动循环使用。
例如,如果设定col=c("red","blue")并需要绘制三条线,则第一条线将为红色,第二条线为蓝色,第三条线又将为红色。
在R中,可以通过颜色下标、颜色名称、十六进制的颜色值、RGB值或HSV值来指定颜色。
例如:col=1
col="white"
col="#FFFFFF"
col=rgb(1,1,1)
col=hsv(0,0,1)
以上都是表示白色的等价方式。
函数rgb()可以基于红-绿-蓝三色值生成颜色。
函数hsv()则基于色相-饱和度-亮度值生成颜色
函数colors()可以返回所有可用颜色的名称。
函数rainbow(),heat.colors(),terrain.colors(),topo.colors(),以及cm.colors()可以用于创建连续型颜色变量。
例如:rainbow(10)可以生成10种连续的”彩虹型“颜色
多阶灰度色可以使用函数grey()生成。参数:gray(0:10/10)生成十阶灰度色。
> n<-10
> mycolors<-rainbow(n)
> pie(rep(1,n),labels=mycolors,col=mycolors)
> mygrays<-gray(0:n/n)
> dev.new()
> pie(rep(1,n),labels=mygrays,col=mygrays)
3.3.3 文本属性
图形参数同样可以用来指定字号,字体和字样。
用于指定文本大小的参数:
参数cex表示相对于默认大小缩放倍数的数值
参数cex.axis 坐标轴刻度文字的缩放倍数
参数cex.lab 坐标轴标签(名称)的缩放倍数
参数cex.main 标题的缩放倍数
参数cex.sub 副标题的缩放倍数
用于指定字体族、字号和字样的参数
参数font 整数。用于指定绘图使用的字体样式。1=常规,2=粗体,3=斜体,4=粗斜体,5=符号字体(以Adobe符号编码表示)
参数font.axis 坐标轴刻度文字的字体样式
参数font.lab 坐标轴标签(名称)的字体样式
参数font.main 标题的字体样式
参数font.sub 副标题的字体样式
参数ps 字体磅值(1磅约为1/72英寸)。文本的最终大小为ps*cex
参数family绘制文本时使用的字体族。标准的取值serif(衬线),sans(无衬线)和mono(等宽)
> par(font.lab=3,cex.lab=1.5,font.main=4,cex.main=2)
之后创建的所有图形都将拥有斜体,1.5倍于默认文本大小的坐标轴标签(名称),以及粗斜体、2倍于默认文本大小的标题。
设置字号和字体样式是轻松的,但是设置字体族却与图形设备相关。
在windows系统中,等宽字体映射为TT Courier New,衬线字体映射为TT Times New Roman,无衬线字体则映射为TT Arial(TT表示True Type)
如果对以上映射表示满意,就可以使用类似于family="serif"这样的参数获得想要的结果
如果不满意,则需要创建新的映射。
在windows中,可以通过函数windowsFont()来创建这类映射。
> par(font.lab=3,cex.lab=1.5,font.main=4,cex.main=2)
> windowsFonts(
+ A=windowsFont("Arial Black"),
+ B=windowsFont("Bookman Old Style"),
+ C=windowsFont("Comic Sans MS")
+ )
在Mac上,改用quartzFonts()
如果以PDF或PostScript格式输出图形,则修改字体族会相对简单一些。
对于PDF格式,可以使用names(pdfFonts())找出系统中哪些字体是可以用的,然后使用pdf(file="myplot.pdf",family="fontname")来生成图形。
对于以PostScript格式输出的图形,则可以以对应地使用names(postscriptFonts())和postscript(file="myplot.ps",family="fontname").
3.3.4 图形尺寸和边界尺寸
用于控制图形尺寸和边界大小
参数pin 以英寸表示的图形尺寸(宽和高)
参数mai 以数值向量表示的边界大小,顺序为”下,左,上,右“,单位为英寸
参数mar 以数值向量表示的边界大小,顺序为”下,左,上,右“,单位为英分。默认值为c(5,4,4,2)+0.1
1英分=1/12英寸
> par(pin=c(4,3),mai=c(1,.5,1,.2))
可以生成一幅 4英寸高,3英寸高,上下边界为1英寸,左边界为0.5英寸,右边界为0.2英寸的图形。
关于边界参数的完整指南,http://research.stowers-institute.org/efg/R/Graphics/Basics/mar-oma
mai
A numerical vector of the form c(bottom, left, top, right) which gives the margin size specified in inches.
以英寸为尺寸
mar
A numerical vector of the form c(bottom, left, top, right) which gives the number of lines of margin to be specified on the four sides of the plot. The default is c(5, 4, 4, 2) + 0.1.
以指定的线条数为尺寸
示例:
> dose<-c(20,30,40,45,60)
> drugA<-c(16,20,27,40,60)
> drugB<-c(15,18,25,31,40)
> opar<-par(no.readonly=TRUE)
> par(pin=c(2,3))
> par(lwd=2,cex=1.5)
> par(cex.axis=0.75,font.axis=3)
> plot(dose,drugA,type="b",pch=19,lty=2,col="red")
> plot(dose,drugB,type="b",pch=23,lty=6,col="blue",bg="green")
> par(opar)
3.4 添加文本、自定义坐标轴和图例
除了图形参数,许多高级绘图参数(例如:plot,hist,boxplot)也允许自行设定坐标轴和文本标注选项。
例子:
> plot(dose,drugA,type="b",col="red",lty=2,pch=2,lwd=2,main="Clinical Trials for Drug A",
+ sub="This is hypothetical data",
+ xlab="Dosage",
+ ylab="Drug Response",
+ xlim=c(0,60),ylim=c(0,70))
提醒:并非所有函数都支持这些参数选项,请参考相应函数的帮助以了解其可以接受哪些选项。
注意:某些高级绘图函数已经包含了默认的标题和标签,可以通过在plot()语句或单独的par()语句中添加ann=FALSE来移除默认的标题和标签。
3.4.1 标题
函数title()为图形添加标题和坐标轴标签。
调用格式为:title(main="main title",sub="sub title",xlab="x-axis label",ylab="y-axis label")
函数title()中亦可指定其他图形参数(如文本大小,字体,旋转角度和颜色)。
实例:
> title(title="My Title",col.main="red",sub="My Sub-title",col.sub="blue",
+ xlab="my x label",ylab="my y lab",
+ col.lab="green",
+ cex.lab=0.75)
3.4.2 坐标轴
可以使用函数axis()来创建自定义的坐标轴,而非使用R中的默认坐标轴。
格式:axis(side,at= ,labels= ,pos=,lty= ,col= ,las= ,tck= ,…)
坐标轴选项:
选项side一个整数,表示在图形的哪边绘制坐标轴(1=下,2=左,3=上,4=右)
选项at一个数值型向量,表示需要绘制刻度线的位置
选项labels 一个字符型向量,表示置于刻度线旁边的文字标签(如果为NULL,则将直接使用at中的值)
选项pos坐标轴线绘制位置的坐标(即与另一条坐标轴相交位置的值)
选项lty线条类型
选项col线条和刻度线颜色
选项las标签是否平行于(=0)或垂直于(=2)坐标轴
选项tck刻度线的长度,以相对于绘图区域大小的分数表示(负值表示在图形外侧,正值表示在图形内侧,
0表示禁用刻度,1表示绘制网格线);默认值为-0.01
(…) 其他图形参数
在创建自定义坐标轴时,应该禁用高级绘图函数自动生成的坐标轴。
参数axes=FALSE将禁用全部坐标轴(包括坐标轴框架线,除非你添加了参数frame.plot=TRUE)。
参数xaxt="n"和yaxt="n"将分别禁用x轴和y轴(会留下框架线,只是去除了刻度)
实例:
> x<-c(1:10)
> y<-x
> z<-10/x
> opar<-par(no.readonly=TRUE)
> par(mar=c(5,4,4,8)+0.1)
> plot(x,y,type="b",
+ pch=21,col="red",
+ yaxt="n",lty=3,ann=FALSE)#yaxt="n"去除y轴刻度线,ann=FALSE移除默认标题和标签
> lines(x,z,type="b",pch=22,col="blue",lty=2)
> #在原图上添加x对1/x的直线
> axis(2,at=x,labels=x,col.axis="red",las=2)
> axis(4,at=z,labels=round(z,digits=2),col.axis="blue",las=2,cex.axis=0.7,tck=-0.01)
> mtext("y=1/x",side=4,line=3,cex.lab=1,las=2,col="blue")
> title("An Example of Creative Axes",xlab="X values",ylab="Y=X")#添加标题和文本
> par(opar)
使用plot()语句可以新建一幅图形。使用lines()语句,可以为一幅现有图形添加新的图形元素。
函数mtext()用于在图形的边界添加文本。
次要刻度线
要创建次要刻度线,需要使用Hmisc包中的minor.tick()函数。
> library(ggplot2)
> library(Formula)
> library(survival)
> library(lattice)
> library(Hmisc)
> minor.tick(nx=n,ny=n,tick.ration=n)#来添加次要刻度线
nx和ny分别制定了x轴和y轴每两条主刻度线之间通过次要刻度线划分得到的区间个数。
tick.ratio表示次要刻度线相对于主刻度线的大小比例。
当前的主刻度线长度可以使用par("tck")获取。
例子:minor.tick(nx=2,ny=3,tick.ratio=0.5)
#在x轴的每两条主刻度线之间添加1条次要刻度线,并在Y轴的每两条主刻度线之间添加2条次要刻度线。
次要刻度线的长度是主刻度线的一半。
3.4.3 参考线
函数abline()可以用来为图形添加参考线。
格式:abline(h=yvalues,v=xvalues)
函数abline()中也可以指定其他图形参数(如线条类型,颜色和宽度)。
例如:abline(h=c(1,5,7))
#在y为1,5,7的位置添加了水平实践。
abline(v=seq(1,10,2),lty=2,col="blue")
#在x为1,3,5,7,9的位置添加了垂直的蓝色虚线。
3.4.4 图例
当图形中包含的数据不止一组时,图例可以帮助你辨别出每个条形、扇形区域或折线各代表哪一类数据。
函数legend()来添加图例。
格式:
Legend(location,title,legend,…)
图例选项:
选项location 指定图例的位置;
方式:1.直接给定图例左上角的x,y坐标。
2.执行location(1),然后通过鼠标单击给出图例的位置。
3.使用关键字bottom,bottomleft,left,topleft,top,topright,right,bottomright,center放置图例。
4.使用方法3时,可以同时使用参数inset=指定图例向图形内侧移动的大小(以绘制区域大小的分数表示)
选项title 图例标题的字符串(可选)
选项legend 图例标签组成的字符型向量。
…
选线col= 加上颜色值,pch= 加上符号值,lwd=宽度值,lty= 类型值,fill=颜色值,bty=盒子样式,bg=指定背景色,cex=指定大小,text.col=文本颜色。
指定horiz=TRUE将会水平放置图例,而不是垂直放置。
help(legend):
legend(x, y = NULL, legend, fill = NULL, col = par("col"),
border = "black", lty, lwd, pch,
angle = 45, density = NULL, bty = "o", bg = par("bg"),
box.lwd = par("lwd"), box.lty = par("lty"), box.col = par("fg"),
pt.bg = NA, cex = 1, pt.cex = cex, pt.lwd = lwd,
xjust = 0, yjust = 1, x.intersp = 1, y.intersp = 1,
adj = c(0, 0.5), text.width = NULL, text.col = par("col"),
text.font = NULL, merge = do.lines && has.pch, trace = FALSE,
plot = TRUE, ncol = 1, horiz = FALSE, title = NULL,
inset = 0, xpd, title.col = text.col, title.adj = 0.5,
seg.len = 2)
例子:
> dose<-c(20,30,40,45,60)
> drugA<-c(16,20,27,40,60)
> drugB<-c(15,18,25,31,40)
> opar<-par(no.readonly=TRUE)
> par(lwd=2,cex=1.5,font.lab=2)
> plot(dose,drugA,type="b",pch=15,lty=1,col="red",ylim=c(0,60),main="Drug A vs. Drug B",xlab="Drug Dosage",ylab="Drug Response")
> lines(dose,drugB,type="b",pch=17,lty=2,col="blue")
> abline(h=c(30),lwd=1.5,lty=2,col="gray")
> library(Hmisc)
> minor.tick(nx=3,ny=3,tick.ratio=0.5)
> legend("topleft",inset=0.05,title="Drug Type",c("A","b"),
+ lty=c(1,2),pch=c(15,17),col=c("red","blue"))
> par(opar)
3.4.5 文本标注
我们可以通过函数text()和mtext()将文本添加到图形上。
函数text()可向绘图区域内部添加文本;
函数mtext()则向图形的四个边界之一添加文本。
格式:
> text(location,"text to place",pos,...)
> mtext("text to place",side,line=n,...)
选项:
选项location 文本的位置参数。可为一对x,y坐标,也可通过指定location为locator(1)使用鼠标交互式地确
定摆放位置
选线pos 文本相对于位置参数的方位。1=下,2=左,3=上,4=右。如果指定了pos,就可以同时指
定参数offset=作为偏移量,以相对于单个字符宽度的比例表示
选项side 指定用来放置文本的边。1=下,2=做,3=上,4=右。你可以指定参数line=来内移或外移
文本,随着值得增加,文本将外移。也可使用adj=0将文本向左下对齐,或使用adj=1右上对
齐
…
选项cex,col,font(分别用来调整字号,颜色和字体样式)
除了用来添加文本标注以外,text()函数通常用来标识图形中的点。我们只需要指定一系列的x,y坐标作为位置参数,同时以向量的形式指定要放置的文本。
x,y和文本标签向量的长度应当相同。
示例:
>attach(mtcars)
> plot(wt,mpg,main="Mileage vs. Car Weight",xlab="Weight",ylab="Mileage",pch=18,col="blue")
> text(wt,mpg,row.names(mtcars),cex=0.6,pos=4,col="red")
> detach(mtcars)
示例2:
> opar<-par(no.readonly=TRUE)
> par(cex=1.5)
> plot(1:7,1:7,type="n")
> text(3,3,"Example of default text")
> text(4,4,family="mono","Example of mono-spaced text")
> text(5,5,family="serif","Example of serif text")
> par(opar)
数学标注:
可以使用类型于TeX中的写法为图形添加数学符号和公式。
help(plotmath)获得更多细节和示例。
函数plot(plotmath)可以为图形主体或边界上的标题、坐标轴名称或文本标注添加数学符号。
3.5 图形的组合
在R中使用函数par()或layout()可以统一地组合多幅图形为一幅总括图形。
可以在par()函数中使用图形参数mfrow=c(nrows,ncols)来创建按行填充的,行数为nrows、列数为ncols的图形矩阵;
另外可以使用nfcol=c(nrows,ncols)按列填充矩阵。
实例:
> attach(mtcars)
> opar<-par(no.readonly=TRUE)
> par(mfrow=c(2,2))
> plot(wt,mpg,main="Scatterplot of wt vs. mpg")
> plot(wt,disp,main="Scatterplot of wt vs disp")
> hist(wt,main="Histogram of wt")
> boxplot(wt,main="Boxplot of wt")
> par(opar)
> detach(mtcars)
在高级绘图函数hist()中包含了一个默认的标题(使用main=" "可以禁用默认它,或者使用ann=FALSE来禁用所有标题和标签)。
函数layout()的调用形式为layout(mat),其中的mat是一个矩阵,它指定了所要组合的多个图形的所在位置。
> attach(mtcars)
> layout(matrix(c(1,1,2,3),2,2,byrow=TRUE))
> hist(wt)
> hist(mpg)
> hist(disp)
> detach(mtcars)
为了更精确地控制每幅图形的大小,可以有选择地在layout()函数中使用widths=和heights=两个参数。
形式为:
widths= 各列宽度值组成的一个向量
heights= 各行高度值组成的一个向量
相对宽度可以直接通过数值指定,绝对宽度(以厘米为单位)可以通过函数lcm()来指定。
> attach(mtcars)
> layout(matrix(c(1,1,2,3),2,2,byrow=TRUE),widths=c(3,1),heights=c(1,2))
> hist(wt)
> hist(mpg)
> hist(disp)
> detach(mtcars)
help(layout)
图形布局的精细控制
这个需要用户对图形布局的精细控制能力。
使用图形参数fig= 完成这个任务。
示例:
> attach(mtcars)
> par(fig=c(0,0.8,0,0.8))
> plot(wt,mpg,xlab="Miles Per Gallon",ylab="Car Weight")
> par(fig=c(0,0.8,0.55,1),new=TRUE)
> boxplot(wt,horizontal=TRUE,axes=FALSE)
> par(fig=c(0.65,1,0,0.8),new=TRUE)
> boxplot(mpg,axes=FALSE)
> mtext("Enhanced Scatterplot",side=3,outer=TRUE,line=-3)
> par(opar)
> detach(mtcars)
参数fig=c(x1,x2,y1,y2)的数值向量,
(1,1)
(y2)