參考:W.N. Venables, D.M. Smith and the R DCT: Introduction to R -- Notes on R: A Programming Environment for Data Analysis and Graphics, 2003. http://bayes.math.montana.edu/Rweb/Rnotes/R.html 前言:关于R
在R的官方教程里是这么给R下注解的:一个数据分析和图形显示的程序设计环境(A system for data analysis and visualization which is built based on S language.)。
R的源起
R是S语言的一种实现。S语言是由 AT&T贝尔实验室开发的一种用来进行数据探索、统计分析、作图的解释型语言。最初S语言的实现版本号主要是S-PLUS。S-PLUS是一个商业 软件,它基于S语言,并由MathSoft公司的统计科学部进一步完好。后来Auckland大学的Robert Gentleman 和 Ross Ihaka 及其它志愿人员开发了一个R系统。R的使用与S-PLUS有非常多类似之处,两个软件有一定的兼容性。
R is free
R是用于统计分析、画图的语言和操作环境。R是属于GNU系统的一个自由、免费、源码开放的软件,它是一个用于统计计算和统计制图的优秀工具。
R是一套完整的数据处理、计算和制图软件系统。其功能包含:数据存储和处理系统;数组运算工具(其向量、矩阵运算方面功能尤其强大);完整连贯的统计分析工具;优秀的统计制图功能;简便而强大的编程语言:可操纵数据的输入和输入,可实现分支、循环,用户可自己定义功能。 R是一个免费的自由软件,它有UNIX、LINUX、MacOS和WINDOWS版本号,都是能够免费下载和使用的,在那儿能够下载到R的安装程序、各种外挂程序和文档。在R的安装程序中仅仅包括了8个基础模块,其它外在模块能够通过CRAN获得。R的特点(1) 有效的数据处理和保存机制。
(2) 拥有一整套数组和矩阵的操作运算符。 (3) 一系列连贯而又完整的数据分析中间工具。 (4) 图形统计能够对数据直接进行分析和显示,可用于多种图形设备。 (5) 一种相当完好、简洁和高效的程序设计语言。它包含条件语句、循环语句、用户自己定义的递归函数以及输入输出接口。 (6) R语言是彻底面向对象的统计编程语言。 (7) R语言和其他编程语言、数据库之间有非常好的接口。 (8) R语言是自由软件,能够放心大胆地使用,但其功能却不比不论什么其他同类软件差。 (9) R语言具有丰富的网上资源一 入门训练
1. 获取帮助
> help.start() 开启帮助文档 >help(solve) 显示某命令的帮助信息,或者 >?solve 对于由特殊字符指定的功能,这些參数必须用单引號或双引號括起来,使之成为一个“字符串”,如 > help("[[") 与某个主题相关的样例通常能够用以下的命令得到 > example(topic)2. 命令简单介绍
R对大写和小写是敏感的;名称不能以数字開始; 主要的命令由表达式或者赋值语句组成。假设一个表达式被作为一条命令给出,它将被求值、打印而表达式的值并不被保存。一个赋值语句相同对表达式求值之后把表达式的值传给一个变量,只是并不会自己主动的被打印出来; 命令由分号(;)来分隔,或者另起新行; 基本命令能够由花括号(f和g)合并为一组复合表达式; 凝视差点儿能够被放在不论什么地方,仅仅要是以井号( # )開始,到行末结束; 假设一个命令在行莫仍没有结束,R将会给出一个不同的提示符,默认的是‘+’。3. 命令文件的运行和输出转向到文件
假设命令存储于一个外部文件里,比方工作文件夹work中的commands.R,他们能够随时在R的任务中被运行
> source("commands.R")在Windows中Source也能够由File菜单运行。 函数sink, > sink("record.lis") 将把全部兴许的输出由终端转向一个外部文件,record.lis。命令 > sink() 将把信息又一次恢复到终端上。4. 数据的保持与对象的清除
R所创建、操作的实体是对象。对象能够是变量、数组、字符串、函数以及由这些元素组成的其他结构;
> objects() 用来显示眼下存储在R中的对象的名字。而当前存储的全部对象的组合被称为workspace; 清除对象能够使用rm命令: > rm(x, y, z, ink, junk, temp, foo, bar) 全部在一个R任务中被创建的对象都能够在文件里被永久保存,并在其他的R任务中被使用。在每一个R任务结束时用户都有机会保存当前有效的全部对象。假设用户这样做的话,对象将被写入当前文件夹一个名为.RData。当R被再次启动时R会从这个文件里再加载workspace。同一时候相关的命令记录也被加载。 所以,推荐大家在用R进行不同的分析时分别使用不同的工作文件夹。5. 基本数据结构
数值型(numeric) | 1,1.2,3.1415926 |
复数型(complex) | 1+2i |
字符型(character) | ‘A’/ “hello world!” |
逻辑型(logical) | TRUE / FALSE |
向量(vector), 见下节
矩阵(matrix): 更一般的说数组是向量在多维情况下的一般形式。其实它们是能够被两个或很多其它的指标索引的向量,而且以特定的方式被打印出来。因子(factors) 提供了一种处理分类数据的更简单介绍的方式。列表(list): 是向量的一种一般形式,并不须要保证当中的元素都是同样的类型,并且当中的元素常常是向量和列表本身。数据框(data frame): 是一种与矩阵相似的结构,当中的列能够是不同的数据类型。能够把数据框看作一种数据"矩阵",它的每行是一个观測单位,并且(可能)同一时候包括数值型和分类的变量。函数( function): 可以在R的workspace中存储的对象。我们可以通过函数来扩展R的功能。二 简单操作,数值与向量
2.1 向量与赋值
R对命名了的数据结构进行操作。最简单的数据结构是数字向量;如,
> x <- c(10.4, 5.6, 3.1, 6.4, 21.7) c()是创建函数,赋值运算符是'<-',与函数assign()等价 > assign("x", c(10.4, 5.6, 3.1, 6.4, 21.7)) 也能够写成: > c(10.4, 5.6, 3.1, 6.4, 21.7) -> x 假设一个表达式被当作一个完整的命令,它的值将被打印到终端但不被储存。 单独输入x则会将值打印出来。也能够打印倒数: > 1/x > y <- c(x, 0, x) 也能够将向量作为元素。2.2 向量运算
操作是依照向量中的元素一个一个进行的。同一个表达式中的向量并不须要具有同样的长度。假设它们的长度不同,表达式的结果是一个与表达式中最长向量有同样长度的向量。表达式中较短的向量会依据它的长度被反复使用若干次(不一定是整数次),直到与长度最长的向量相匹配。而常数非常明显的将被不断反复。如,
> v <- 2*x + y + 1经常使用运算有: +,-,*,/,^(次方);log, exp, sin, cos, tan,sqrt等;max和min的作用是选出所给向量中最大的或最小的元素;range函数的值是一个长度为2的向量,即c(min(x),max(x))length(x)返回了向量x中元素的个数,也就是x的长度。sum(x)给出了x中全部元素的总和;prod(x)给出x中全部元素的乘积;mean(x)和var(x),分别计算样本均值和样本方差,这两个函数分别相当于sum(x)/length(x),sum((x-mean(x)) \^2)/(length(x) -1)。假设var()的參数是一个n*p的矩阵,那么函数的值是一个p*p的样本协方差矩阵,觉得每行是一个p变量的样本向量。sort(x)返回一个与x具有同样长度的向量,当中的元素按招升序排列。还有其它更灵活的排序功能(參见order()和sort.list())。pmax和pmin将返回一个与最长的向量长度相等的向量,向量中的元素由參数中全部向量在对应位置的最大值(最小值)组成; 假设要使用复数,须要直接给出一个复数部分。因此sqrt(-17)将会返回NaN(无效数值)和一个警告,而sqrt(-17+0i)将依照复数进行运算。2.3 生成序列
最简单的方法是用冒号‘:’,冒号具有最高运算优先级。比如1:30就是向量c(1,2,. . .,29,30)。30:1构造一个递减序列。
利用seq()函数构造序列:有五个參数,from, to, by, length, along from, to能够不写參数名,seq(2,10)就相当于2:10。 by指定步长,默觉得1,如seq(-5, 5, by=.2)即为c(-5.0, -4.8, -4.6, ..., 4.6, 4.8, 5.0) length指定序列长度,如seq(length=51, from=-5, by=.2),等同于seq(-5, 5, by=.2) along=vector仅仅能单独使用,产生一个“1:length(vector)”序列。类似的函数是rep(),这个函数能够用多种复杂的方法来 复制一个对象。最简单的形式是> s5 <- rep(x, times=5)2.4 逻辑向量
TRUE, FALSE, 和NA(not available), 前两个能够简写为T和F,但T/F并非系统保留字,能够被用户覆盖,所以不妨不要简写。
逻辑向量是由条件给出的,例如以下列语句令temp成为一个与x长度同样,对应位置依据是否与条件相符而由TRUE或FALSE组成的向量: > temp <- x > 13逻辑操作符包含<, <=, >, >=,全然相等==和不等于!=,与或非分别为&, |, !。 在普通运算中,FALSE当做0而TRUE当做1。2.5 缺失值
NA(not available): 一般来讲一个NA的不论什么操作都将返回NA。
is.na(x)返回一个与x等长的逻辑向量,而且由对应位置的元素是否是NA来决定这个逻辑向量对应位置的元素是TRUE还是FALSE。 x==NA是一个与x具有同样长度而其全部元素都是NA的向量。NaN(Not a Number): 由数值运算产生,如0/0, Inf-Inf. is.na(x)对于NA和NaN值都返回TRUE, is.nan(x)仅仅对NaN值返回TRUE。2.6 字符向量
字符串在输入时能够使用单引號(')或双以号("); 在打印时用双引號(有时不用引號)。
R使用与C语言风格基本同样的转义符, 所以输入\\打印的也是\\, 输入\" 打印引號", \n: 换行, \t: tab, \b: 回格。 字符向量能够通过函数c()连接;paste()能够接受随意个參数,并从它们中逐个取出字符并连成字符串,形成的字符串的个数与參数中最长字符串的长度同样。假设參数中包括数字的话,数字将被强制转化为字符串。在默认情况下,參数中的各字符串是被一个空格分隔的,只是通过參数sep=string 用户能够把它更改为其它字符串,包括空字符串。比如: > labs <- paste(c("X","Y"), 1:10, sep="") 使变量labs成为字符变量c("X1", "Y2", "X3", "Y4", "X5", "Y6", "X7", "Y8", "X9", "Y10")2.7 index vector---数据集子集的选择与改动
不论什么结果为一个向量的表达式都能够通过追加索引向量(index vector)来选择当中的子集。
1 逻辑的向量。 > y <- x[!is.na(x)] 表示将向量x中的非NA元素赋给y; > (x+1)[(!is.na(x)) & x>0] -> z 表示创建一个对象z,当中的元素由向量x+1中与x中的非缺失值和正数相应的向量组成。2. 正整数的向量 > x[6] 是x的第六个元素 > x[1:10] 选取了x的前10个元素(如果x的长度不小于10)。 > c("x","y")[rep(c(1,2,2,1), times=4)] 产生了一个字符向量,长度为16,由"x", "y", "y", "x"反复4次而组成。3. 负整数的向量 > y <- x[-(1:5)] 表示向量y取向量x前5个元素以外的元素。4. 字符串的向量 仅仅存在于拥有names属性并由它来区分向量中元素的向量。这样的情况下一个由名称组成的子向量起到了和正整数的索引向量同样的效果。 > fruit <- c(5, 10, 1, 20) > names(fruit) <- c("orange", "banana", "apple", "peach") > lunch <- fruit[c("apple","orange")]子集的改动 > x[is.na(x)] <- 0 表示将向量x中所以NA元素用0来取代 > y[y < 0] <- -y[y < 0] 表示将向量(-y)中 与向量y的负元素相应位置的元素 赋值给 向量y中 与向量y负元素相应的元素。作用相当于: > y <- abs(y)三 对象,模式和属性
3.1 固有属性:模式和长度
对象是R所进行操作的实体,对象能够是向量、列表等,详见1.6.
对象的模式包含numeri,ccomplex,character,logical,list,function,expression等。能够用mode(object)查看。对象的长度是对象的还有一固有属性。能够用length(object)查看。attribute(object)能够查看更深入的属性。模式的转换
在同意的情况下(大多数情况都是同意的),R能够完毕各种模式的转换。比如:d<-as.character(z),将数值向量z<-(0:9)转化为字符向量c("0", "1", "2", ..., "9")。as.integer(d)将d转化为数值向量。 R中非常多形式为as.something()的函数,能够完毕从一个模式向还有一个模式的转化,或者是令对象取得它当前模式不具有的某些属性。3.2 改变对象的长度
> e <- numeric() 产生一个numeric型的空向量e。character()等类似。此时长度为对象0。
此时新加入�一个元素会使e的长度自己主动调整。 > e[3] <- 17 令e为一个长度为3的向量(此时,该向量的前两个元素都是NA)缩短(截断)一个对象的长度,仅仅须要一个赋值命令。因此,若alpha是一个长度为10的对象,以下的命令 > alpha <- alpha[2 * 1:5]3.3 属性的获取和设置
函数attributes(object)将给出当前对象所具有的全部非基本属性(长度和模式属于基本属性)的一个列表。
函数attr(object,name)能够被用来选取一个指定的属性。除了为某些特殊的目的创建新属性这样特殊的环境下,这些函数非常少被用到。 当函数attr()用在赋值语句左側时,既能够是将对象与一种新的属性关联,也能够是对原有属性的更改。比如 > attr(z,"dim") <- c(10,10) 另R将z作为一个10X10的矩阵看待。3.4 对象的类别
对象的一个特别属性,类别,被用来指定对象在R编程中的风格。比方:假设对象类别"data.frame"则会以特定方式处理。
unclass()能够去除对象的类别。summary()能够查看对象的基本信息(min, max, mean, etc.)四 有序因子和无序因子
因子是一种向量对象,它给自己的组件指定了一个离散的分类(分组),它的组件由其它等长的向量组成。R提供了有序因子和无序因子。
通俗点说,因子就是将对象的值分成不同的组(levels)。 用函数factor()创建一个因子,levels按序排列(字母序或数值序)。比如province<-c("四川","湖南","江苏","四川","四川","四川","湖南","江苏","湖南","江苏"),为province创建因子:
> pf<-factor(province) 创建province的因子pf > pf 打印出来 [1] 四川 湖南 江苏 四川 四川 四川 湖南 江苏 湖南 江苏 Levels: 湖南 江苏 四川函数levels()能够用来观察因子中有多少不同的levels。假如我们拥有这些省份考生的分数:
> score<-c(95,86,84,92,84,79,86,99,85,90)函数tappley()能够用来计算各省的平均分数,函数tapply()的作用是对它第一个參数的组件中所包括的每一个组应用一个參数三指定的函数。 > smeans<-tapply(score,pf,mean) > smeans 湖南 江苏 四川 85.66667 91.00000 87.50000 再比如,以下命令会给出各组的length > tapply(score,pf,length) 湖南 江苏 四川 3 3 4函数ordered()能够创建有序因子
> ordered(province) [1] 四川 湖南 江苏 四川 四川 四川 湖南 江苏 湖南 江苏 Levels: 湖南 < 江苏 < 四川五 数组和矩阵
5.1 数组
数组能够看成一个由递增下标表示的数据项的集合,比如数值。
数组的生成 假设一个向量须要在R中以数组的方式被处理,则必须含有一个维数向量作为它的dim属性。 维度向量由dim()指定,比如,z是一个由1500个元素组成的向量。以下的赋值语句 > dim(z) <- c(3,5,100) 使它具有dim属性,而且将被当作一个3X5X100的数组进行处理。 c(3,5,100) 就是他的维度向量。 还能够用到像matrix()和array()这种函数来赋值。比方 > array(1:20, dim=c(4,5)) > matrix(1:24, 3,4) 数据向量中的值被赋给数组中的值时,将遵循与FORTRAN同样的原则"主列顺序",即第一个下标变化的最快,最后的下标变化最慢。数组的运算 数组能够在算数表达式中使用,结果也是一个数组,这个数组由数据向量逐个元素的运算后组成,通常參与运算的对象应当具有同样的dim属性。5.2 数组的索引和数组的子块
数组中的单个元素能够通过下标来指定,下标由逗号分隔,写在括号内。
我们能够通过在下标的位置给出一个索引向量来指定一个数组的子块,只是假设在不论什么一个索引位置上给出空的索引向量,则相当于选取了这个下标的所有范围。 如a[2,,],a[,3,]等5.3 索引数组
除了索引向量,还能够使用索引数组来指定数组的某些元素。
比如:有4X5的数组a,若要得到a中的a[1,3], a[2,2] 和a[3,1]这三个元素,能够生成索引向量i,然后用a[i]得到它们。 > a <- array(1:20,dim=c(4,5)) # Generate a 4 by 5 array. > i <- array(c(1:3,3:1),dim=c(3,2)) > i [,1] [,2] [1,] 1 3 [2,] 2 2 [3,] 3 1 > a[i] [1] 9 6 3 > a[i] <- 0 # 将这三个元素用0替换。5.4 向量,数组的混合运算
表达式从左到右被扫描;
參与运算的随意对象假设大小不足,都将被反复使用直到与其它參与运算的对象等长; 当较短的向量和数组在运算中相遇时,全部的数组必须具有同样的dim属性,否则返回一个错误; 假设有随意參与运算的向量比參与运算的矩阵或数组长,将会产生错误; 假设数组结构正常声称,而且没有错误或者强制转换被应用于向量上,那么得到的结果与參与运算的数组具有同样的dim属性。5.5 矩阵的运算
构建分区矩阵:cbind()和rbind(),cbind()依照水平方向,或者说按列的方式将矩阵连接到一起。rbind()依照垂直的方向,或者说按行的方式将矩阵连接到一起。
外积:操作符是%o%:
> ab <- a %o% b 或者 > ab <- outer(a, b, "*") 当中的乘法操作能够由随意一个双变量的函数替代。广义转置:函数t(A),或aperm(A, c(2,1));
获取行数/列数:nrow(A)和ncol(A)分别返回矩阵A的行数和列数。
矩阵乘法:操作符为%*%;
交叉乘积(cross product):crossprod(X,Y)等同于t(X) %*% y,crossprod(X)等价于crossprod(X, X);
diag(v):假设v是向量,diag(v)返回一个由v的元素为对角元素的对角矩阵。
假设v为矩阵,diag(v)返回一个由v主对角元素组成的向量。 假设v仅仅是一个数值,那么diag(v)是一个vXv的单位矩阵。特征值和特征向量:eigen(Sm)。这个函数的结果是由名为values和vectors的两部分组成的列表。假设仅仅是须要特征值:eigen(Sm)$values
最小二乘拟合即QR分解:lsfit(), qr()。
强制转换为向量:as.vector(),或者直接c().
解线性方程和求矩阵的逆,神秘值分解与行列式见<R语言笔记>;
六 列表和数据帧
6.1 列表
列表是由称作组件的有序对象集合构成的对象。组件的模式或类型不一定同样。
形如Lst <- list(name_1=object_1, . . ., name_m=object_m)的赋值将创建一个包括m个组件的列表,并依据參数中指定的名称为其命名。(其名称能够自由选取)。假设它们的名称被省略,组件将仅仅是被编号。比如: > Lst <- list(name="Fred", wife="Mary", no.children=3,child.ages=c(4,7,9))所使用的组件是被复制到新的列表中的,对原始对象没有影响。
组件总是被编号的,而且能够通过编号指定。Lst[[1]] 即为"Fred",也能够用 Lst$name,Lst[["name"]]指定。假设Lst[[4]]是一个有下标的数组,Lst[[4]][1]就是它的第一项。区分Lst[[1]]和Lst[1],'[[...]]'是选择单个元素时使用的操作符,而'[...]'是一个一般的下标操作符。因此,前者代表列表Lst中的第一个对象;后者是列表Lst的子列表,仅包括列表的第一项。 组件的名称能够缩写,可缩写的程度是仅仅要能令组件被唯一的识别就能够了。如:Lst$na等价于Lst$name, Lst$w等价于Lst$wife。扩展列表能够通过指定额外组件的方式。比如
> Lst[5] <- list(matrix=Mat)连接列表
当连接函数c()的參数为列表时,其结果也是一个模式为列表的对象。由參数中的列表作为组件依次连接而成。 > list.ABC <- c(list.A, list.B, list.C)6.2 数据帧
数据帧是类别为"data.frame"的列表;
数据帧会被当作各列具有不同模式和属性的矩阵。 数据帧依照矩阵的方式显示,选取的行或列也依照矩阵的方式来索引。创建数据帧
直接创建:那些满足对数据帧的列(组件)限制的对象能够通过函数data.frame来构建成为一个数据帧
> t <- data.frame(home=statef, loot=income, shot=incomef)强制转换:假设一个列表的组件与数据帧的限制一致,这个列表就能够通过函数as.data.frame()强制转化为一个数据帧。外部文件:创建数据帧最简单的方法应当是使用read.table()函数从外部文件里读取整个数据帧。数据帧和列表的限制
1 组件必须是向量(数值型,字符形,逻辑型),因子,数值矩阵,列表,或其它数据帧;
2 矩阵,列表,数据帧向新数据帧提供的变量数各自等于它们的列数,元素数和变量数; 3 数值向量,逻辑值和因子在数据帧中保持不变,字符向量将被强制转化为因子,其水平是字符向量中所出现的值; 4 数据帧中作为变量的向量结构必须具有同样的长度,而矩阵结构应当具有同样的行大小。挂接和卸载数据帧
当认为使用'$'引用数据帧元素(如't$home')麻烦时,能够进行数据帧挂接
> attach(t) 这样能够直接引用数据帧内的元素,而无需'$',前提是数据帧外没有同名的变量(如name)。 挂接后若要对数据帧元素进行赋值操作,仍需用'$',否则视为赋值给数据帧外的元素。 赋值后必需要先卸载(detach)再又一次挂接后,新值才可见。 > detach(t)attach()是具有一般性的函数,即它不仅可以将文件夹和数据帧挂接在搜索路径上,还能挂接其它类别的对象。特别是模式为"list"的对象可以通过同样的方式挂接:
> attach(any.old.list) 不论什么被挂接的对象都能够用detach来卸载,通过指定位置编号或者指定名称这种方式.搜索路径
函数search()将显示眼下的搜索路径,能够用来查看数据帧/列表的挂接状态。ls()(或objects())命令能够用来检查搜索路径任何位置上的内容。如:ls(), ls(2), ls(t) R能够在搜索路径中包括至多20个项目,列表和数据帧仅仅能在位置2或更靠后的位置上挂接。数据帧使用惯例
1 将每一个独立的,适当定义的问题所包括的全部变量收入同一个数据帧中,并赋予合适的、易理解、易辨识的名称;
2 处理问题时,当对应的数据帧挂接于位置2,同一时候在第1层工作文件夹下存放操作的数值和暂时变量; 3 在结束一次工作之前,将你觉得对将来有參考价值的变量通过$标记的形式加入�到数据帧里面,然后detach(); 4 最后,将工作文件夹下全部不须要的变量剔除,而且尽量将剩下多余的暂时变量都清除干净。 这样我们能够非常easy的在同一个文件夹下处理多个问题,并且对每一个问题都能够使用x,y,z这种变量名。七 从文件里读取数据
7.1 函数read.table()
该函数能够直接将文件里完整的数据帧读入。此时文件要符合特定的格式:
1 第一行应当提供数据帧中每一个变量的名称; 2 每一行(除变量名称行)应包括一个行标号和各变量的值。 3 若没有表头(变量名称行),也没有行标号,仅仅有变量值,则默认变量名称为"v1","v2"... 4 若有表头,但没有行标号,则能够指定參数header=TRUE.7.2 函数scan()
该函数从键盘或文件里读取数据,并存入向量或列表中。
> inp <- scan(file, what) 第一个參数是文件名称,如“test.txt”,若为“”或空,则从键盘读入数据; 第二个參数用于确定读入数据的模式。 如:list("",0,0) 指定读入到列表中,列表有三项,且列表第一项是字符型,第二三项是数值型。若为0,则指定读入到一个数值向量中,若为“”则指定读入到字符向量中。7.3 内置数据集的读取
R本身提供超过50个数据集,同一时候在功能包(包含标准功能包)中附带很多其它的数据集。与S-Plus不同,这些数据即必须通过data函数加载。
> data() #获得基本系统提供的数据集列表,然后通过形如 > data(infert) #来加载名为infert的数据集 从其它package中加载数据集 data(package="nls") #查看nls中数据集 data(Puromycin, package="nls") #读取nls中Puromycin数据集。 用library()挂接package后,它的数据集也自己主动包括到搜索路径中了。 library(nls) #加载package nls data() #查看数据集 date(Puromycin) #加载Puromycin数据集7.4 编辑数据
在使用一个数据帧或矩阵时,edit提供一个独立的工作表式编辑环境。
> xnew <- edit(xold) #对数据集xold进行编辑。并在完毕时将修改后的对象赋值给xnew > xnew <- edit(data.frame()) #能够通过工作表界面录入新数据。fix()函数用于直接改动已有的对象,等价于 x<-edit(x).
八 概率分布
8.1 R是一个统计表集合(略读)
R提供了一套完整的统计表集合。函数能够对累积分布函数P(X<=x),概率密度函数,分位函数(对给定的q,求满足P(X<=x) > q的最小x)求值,并依据分布进行模拟。
![](https://img-my.csdn.net/uploads/201211/22/1353545864_1001.png)
8.2 检測数据集的分布
函数summary和fivenum这两个函数能够给出摘要,后者仅仅给出数值;
函数stem能够将数值统计结果以类似直方图的方式显示出来; 函数hist()能够绘制直方图; 函数density和line能够获得更美丽的密度图; 功能包fun中的ecdf函数能绘制经验累积分布函数; 还能够进行拟合正态分布,覆盖拟合CDF; 还能够绘制Quantile-quantile (Q-Q)图有助于我们更仔细的检測其分布形态;8.3 单样本和两样本检验(略读)
九 语句组、循环和条件操作
R是一种表达式语言,也就是说其命令类型仅仅有函数或表达式,并由它们返回一个结果。
语句组由花括号‘{ }’确定,此时结果是该组中最后一个能返回值的语句的结果。条件语句
> if (expr_1) expr_2 else expr_3
当中条件表达式expr1必须返回一个逻辑值,操作符&&和||常常被用于条件部分。&和|与&&,||的差别在于,&和|依照逐个元素的方式进行计算,&&和||对向量的第一个元素进行运算,仅仅有在必需的时候才对第二个參数求值。 if/else结构的向量版本号是函数ifelse,其形式为ifelse (condition,a,b),产生函数结果的规则是:假设condition[i]为真,相应a[i]元素;反之相应的是b[i]元素。依据这个原则函数返回一个由a,b中相应元素组成的向量,向量长度与其最长的參数等长。循环语句
> for (name in expr_1) expr_2当中name是循环变量,expr1是一个向量表达式(一般是1:20这种序列),而expr2常常是一个表达式语句组,expr2随着name依次取expr1结果向量的值而被多次反复执行。
> repeat(expr)
> while(condition) expr
break语句能够用来中断不论什么循环,可能是非正常的中断。并且这是中止repeat循环的唯一方式。
next语句能够中止一个特定的循环,跳至下一个.
十 编写自己的函数
10.1 函数的定义
> name <- function(arg_1, arg_2, ...) expression
expression是一个R表达式(一般是表达式语句组),并使用參数arg_i来计算出一个数值,表达式的值就是函数的返回值。函数调用的形式通常都是name(expr1,expr2,...)10.2 定义新的二元操作符
能够将函数定义为新的二元操作符:
> "%!%" <- function(X, y) { ... } 正如矩阵乘法运算符,%*%,和矩阵外积运算符%o%10.3 指定參数和默认值
假设被调用函数的參数依照"name = obj"的形式给出,那么參数的次序能够是随意的。
并且,參数序列能够在開始依次序给出,而将指定名称的參数置于后面。 因此,假设由一个函数fun1被定义为 > fun1 <- function(data, data.frame, graph, limit) { [function body omitted] } 那么函数能够有多种等价的用法,比如 > ans <- fun1(d, df, TRUE, 20) > ans <- fun1(d, df, graph=TRUE, limit=20) > ans <- fun1(data=d, limit=20, graph=TRUE, data.frame=df)默认值 :在非常多情况下,參数都会被赋予一个普遍适用的默认值。 > fun1 <- function(data, data.frame, graph=TRUE, limit=20) { ... } 则函数能够这样被调用 > ans <- fun1(d, df) 此时与上面三种情况等价,也能够这样调用 > ans <- fun1(d, df, limit=10) 此时改变了一个默认值。 NOTE:參数能够是随意表达式,甚至能够是包括其它參数的表达式;10.4 额外參数“...”
当须要将一个函数的參数传递给还有一个函数时,能够通过包括一个额外的參数"..."实现。
fun1 <- function(data, data.frame, graph=TRUE, limit=20, ...) { [omitted statements] if (graph) par(pch="*", ...) [more omissions] }10.5 全局变量和局部变量
函数内的赋值都是局部变量,退出函数就丢失了。
假设要在函数内进行永久赋值(定义全局变量),须要用到“超赋值”操作符, <<-或者函数assign()。10.6 一些高级演示样例
区组设计的效率因子 (E±ciency factors)
删除打印数组中的全部名称 递归的数值积分10.7 范畴(Scope)
函数主体内出现的标识(symbol)能够被分为3类;正式參数、局部变量和自由变量。
正式參数就是出如今函数參数列表中的參数,他们的值由实际的函数參数与正式參数的绑定(binding)过程决定。局部变量是在參数主体中,由表达式求值过程决定的变量。自由变量为既不是正式參数又不是局部变量的变量。赋值之后自由变量成为局部变量。在R中,自由变量的值由函数被创建的环境中与其同名的第一个变量值决定(我理解为近期的同名变量),这样的方式被称为词汇式范畴(lexical scope)。
而在S中,该值由同名的全局变量决定。 比如以下的函数cube,在R中cube(2)=8,在S中报错为sq()找不到n。 cube <- function(n) { sq <- function() n*n n*sq() }一个银行账户的样例,详见《R语言笔记》。
10.8 定制环境
详见《R语言笔记》。
10.9 类别,通用函数和对象定位
一个对象的类别(class)决定了他会怎样被通用函数(generic function)处理。
假设參数本身没有不论什么类别属性,或者其类别在特定问题中并不满足通用函数的要求,一般会有一个默认的动作被运行。 类别机制使用户能够为特定的目的设计和编写通用函数。 使用> methods(class="data.frame")能够查看数据帧的通用函数。 使用> methods(plot)能够查看plot函数能处理的类别。十一 R的统计模型
待阅。
![](https://img-my.csdn.net/uploads/201211/22/1353545899_1590.png)
十二 图形过程
在Windows下用window()命令能够打开图形窗体。
12.1 高级画图命令
高级画图函数,由函数參数提供数据生成一幅完整的图形。当中适当的坐标轴,标签和标题都自己主动生成了(除非你另外指定了)。高级画图命令每次都生成一幅新的图形,清除当前的图形(假设须要的话)。
1 plot()函数
这是一个通用函数:生成图形的类型取决于第一个參数的类型或类别(class)。
plot(x,y) plot(xy): 假设x,y是向量,plot(x,y)生成一幅y对x的散点图。用包括两个元素x,y的一个列表或一个两列的矩阵作为一个參数(另外一种形式那样的)也能达成同样的效果。 plot(x): 假设x是一个时间序列,这个命令生成一个时间序列图,假设x是一个数值型向量,则生成一个向量值对它们向量索引的土,而假设x是一个复向量,则生成一个向量中元素的虚部对实部的图。 plot(f) plot(f,y): f是一个因子对象,y是一个数值型向量。第一种形式生成一个f的条形图;另外一种形式生成y相应于f各个水平的箱线图。 plot(df) plot( expr) plot(y expr): df是一个数据帧,y是随意对象,expr是由对象名称组成的列表,分隔符'+'(比如,a + b + c)。前两种形式生成分布式的图形,第一种是数据帧中的变量,另外一种是一系列被命名的对象。第三种形式生成y对expr中每一个对象的图。2 显示多元数据
假设X是一个数值矩阵或数据帧,以下的命令
> pairs(X) 生成一个配对的散点图矩阵,矩阵由X中的每列的列变量对其它各列列变量的散点图组成,得到的矩阵中每一个散点图行、列长度都是固定的。当问题涉及到三、四个变量时,使用coplot更好些。假设a和b是数值向量,c是数值向量或因子对象(全都是同样长度的),以下的命令
> coplot(a ~ b | c) 相应c的某些给定值生成数个a对b的散点图。当c是一个因子时,这个命令也就是对c的每一个水平生成a对b的散点图。当c是数值向量的时候,这个数值向量被分为一系列的条件区间(conditioning intervals),相应c的每一个区间生成一个a对b的散点图。区间的数量和位置能够通过coplot()的參数given.values来控制,函数co.intervals()也能够用来选择区间。我们也能够使用两个给定变量通过命令 >coplot(a ~ b | c+d) 对c和d的每一个联合条件区间生成a对b的散点图。函数coplot()和pairs()都能够使用參数panel=,这个參数能够用来定制我们得到的图形类型。默认的是points()函数,生成一个散点图,只是通过在參数panel=中提供某些其他的低级图形函数,我们能够生成须要的各种图形。一个非常实用的函数样例是panel.smooth()。
3 显示图形
qqnorm(x) qqline(x) qqplot(x,y)
分布比較图。第一种形式生成向量x对期望正态分数(一个正态记分图),第二个在上面的图上加入�一条穿过分布分位点和数据分位点的直线。第三个命令生成x的分位点对y分位点图,用于分别比較它们的分布。hist(x) hist(x,nclass=n) hist(x,breaks=b, . . . )
生成数值变量x的直方图。一般会自己主动选定一个合理的类别数,只是能够通过nclass=參数来指定一个推荐值。或者通过參数breaks=来指定分界点。假设给定了probability=TRUE參数,那么条形图代表相对频数而不是累计数。dotchart(x, . . . )
创建一个x中数据的点图(dotchart)。点图中y轴给出x中数据的标签,x轴给出它们的值。它同意对落入某一特定区间的全部数据项方便的进行可视化选择。image(x,y,z, . . . ) contour(x,y,z, . . . ) persp(x,y,z, . . . )
生成三个变量的图。函数image是用不同的颜色绘制一些矩形方格来展示z的值,函数contour通过绘制等高线来展示z的值,函数persp绘制一个3D面。4 參数配置
add=TRUE 强制函数依照低级图形函数的方式操作,将图形置于当前图形上(仅对某些函数有效)。
axes=FALSE 临时禁止坐标轴的生成|以便使用axis()函数加入�你自己定制的坐标轴。默认情况是axes=TRUE,即包括坐标轴。log="x" log="y" log="xy" 令x,y或者两者全都对数化。这个參数对很多函数都有效,只是不是所有。type= 參数type=控制所生成图形的类型: type="p" 绘制单独的点(默认值) type="l" 绘制线 type="b" 绘制由线连接的点(both) type="o" 将点绘在线上 type="h" 绘制从点到零轴的垂线(high-density) type="s" 阶梯式图。第一种形式中,点由垂线的顶部定义;另外一种形式里用底部定义。 type="n" 不绘制。只是坐标轴是绘出的(默认情况)并且要依据数据绘出坐标系统。用来给兴许的低级图形函数创建图形作基础。xlab=string ylab=string x轴或y轴的标签。使用这些參数来改变默认的标签,通常的默认值是调用高级画图函数时所使用对象的名称。main=string 图表标题,位于图形的顶部,大字体显示。 sub=string 子标题,位于x轴以下,用较小的字体显示。12.2 低级画图命令
有些时候高级画图函数并不能非常精确的生成我们想要的图形。这样的情况下,我们能够通过低级画图命令在当前图形上加入�信息(比如,点、线或文本)。
points(x,y) lines(x,y)
在当前图形上加入�点或线。函数plot()的參数type=也能够用于这些函数(默认的是"p"代表points()和"l"代表lines())。text(x,y,labels, . . . )
给定点坐标x,y,在该点加入�文本。通常labels是一个整数或字符向量,当中labels[i]出如今点(x[i],y[i])。默认值是1:length(x)。 Note: 这个函数通经常使用于这种序列中 > plot(x, y, type="n"); text(x, y, names) 图形參数type="n"阻止了点的生成,可是建立了坐标轴,由函数text()提供字符向量names所指定的特定字符。abline(a, b) abline(h=y) abline(v=x) abline(lm.obj)
在当前图上加入�一条斜率为b,截距为a的直线。h=y在图形指定的高度上绘制一条贯穿图形的水平线,相同的,v=x在x轴的指定位置绘制一条贯穿的垂线。而lm.obj是一个包括coefficients组件的列表,该组件的长度为2,分别当作截距和斜率。polygon(x, y, . . . )
绘制一个多边形,其顶点由(x,y)指定。同一时候还(可选的)能够加上阴影线,假设图形设备同意的话还能够将多边形填充。legend(x, y, legend, . . . )
这当前图形的指定位置加入�图例。绘制的字符,线条类型,颜色等等由字符向量legend指定。除此之外至少还要给出一个參数v,与画图单元的对应值,分别有: legend( , fill=v)填充方框的颜色 legend( , col=v)绘制点线的颜色 legend( , lty=v)线条类型 legend( , lwd=v)线条宽度 legend( , pch=v)绘制字符(字符向量)title(main,sub)
在当前图形的顶部用大字题加入�一个标题main,在底部用较小的字体加入�子标题sub。axis(side, . . . )
在当前图形的指定边上加入�坐标,在哪个边上由第一个參数指定(1到4,从底部依照顺时针顺序)。其它參数控制坐标的位置|在图形内或图形外,以及标记的位置和标签。适合在调用參数为axes=FALSE的函数plot()后加入�定制的坐标轴。低级画图函数通常都须要一些位置信息(比如,x,y坐标)来决定在哪里加入�新的元素。坐标以用户坐标(user coordinates)的形式给出,这个坐标系是依据所提供的数据由之前的高级画图语句定义的。须要x,y參数的地方还能够选用一个单独的參数,即一个由名为x,y的元素组成的列表。相似的,一个两列的矩阵也能够。像locator()(后面会提到)这种函数也能够依照这种方式交互的指定图形中的位置。
加入�数学凝视
某些情况下须要在图形中添�数学符号或公式。在R中能够通过在text, mtext,axis或title中指定一个表达式来实现。比如,以下的代码绘制了二项概率函数的公式: > text(x, y, expression(paste(bgroup("(", atop(n, x), ")"),p^x, q^{n-x}))) 很多其它的信息,包含其特性的一个完整列表能够在R中通过以下的命令得到: > help(plotmath) > example(plotmath)加入�Hershey矢量字体
> help(Hershey) > example(Hershey)12.3 图形的交互
R提供了函数,使用户能够通过鼠标从图形中释放信息或加入�信息。
locator(n,type)
等待用户使用鼠标左键在当前图形上选择位置。直到n(默认是512)个点都选完或者点击了鼠标还有一个键(Unix,Windows),在Mac下用鼠标点击图形窗体外的部分也能够结束。參数type的效果和在高级画图函数中使用时是一样的,即在选择的点绘制指定的图形。默认情况是不绘制图形。函数locator()将所选点的坐标返回到一个列表中,列表包括x,y两个组件。 通常locator()在调用的时候并不带參数。这个功能在为图例或标签这种图形元素选择位置时比較实用,尤其是这些位置不好通过计算得到的时候。举个样例,假设要在一个野点附近加入�一些信息,能够使用以下的命令 > text(locator(1), "Outlier", adj=0)identify(x, y, labels)
同意用户在x,y(使用鼠标左键)定义的点附近绘制对应的labels的组件(假设没有给出labels就给出该点的序号),突显该点。当鼠标的还有一个键被点击时(Unix,Windows)返回被选点的序号,在Mac下通过点击图形窗体外来实现这个效果。 有时我们更想确定图形中的点,而非它们的位置。比如,我们可能希望从图示中选出某些感兴趣的观測点,然后进行某些操作。通过两个数值向量x,y给定一系列坐标(x; y),我们能够使用identify()函数: > plot(x,y) > identify(x,y) 函数identify()本身不画图,可是同意用户移动鼠标,在某点附近点击左键。离鼠标指针近期的点将被突显,并标出其序号(也就是它在向量x/y中的位置)。或者使用identify()的labels參数,把某些信息(比如案例名称)作为突显的标志;或者通过plot=FALSE參数取消全部突显标志。当选点的过程结束后,identify()返回所选点的序号;用户能够使用这些序号从x和y中释放所选的点。12.4 使用图形參数
通过图形參数能够定制图形显示的差点儿全部方面。R包括大量的图形參数,能够控制的包括线条类型,颜色,图标排列,文本对齐等等。
1 持续性变更 (Permanent changes): par()函数
通过par()函数设定图形參数的值会持续性的更改參数的值,也就是说这之后(在当前设备上)全部对图形函数的调用都受到新值的影响。
函数par()用于存取和改动当前图形设备的图形參数列表。par()不带不论什么參数,返回当前设备全部图形參数和它们的值的列表。par(c("col","lty")) 參数为一个字符向量,仅返回參数中指定的图形參数(也是作为一个列表)。par(col=4, lty=2) 带指定參数(或一个列表型參数),设定指定图形參数的值,并将參数的原始值作为一个列表返回。 所以假设想设定參数绘制一些图形后再恢复成原来的设定,能够这么做: > oldpar <- par(col=4, lty=2) . . . plotting commands . . . > par(oldpar)2 暂时性变更:图形函数的參数
图形參数也能够作为(差点儿)全部图形函数的命名參数。这样的方式的效果和用于par()函数的效果是一样的,仅仅只是这样的改变仅仅在函数调用的区间内有效。比方:
> plot(x, y, pch="+") 生成一个以加号作为画图符号的散点图,而不改变兴许图形的默认的画图符号。3 图形參数列表
A 图形元素
R图表由点、线、文本和多边形(填充区)组成。以下的图形參数控制了图形元素的绘制:pch="+" 用来绘点的字符。这个默认值随不同的图形驱动是不同的,只是通常都是'±'。除非使用"."作为画图字符,否则绘制的点都会比适当的位置高一点或者低一点,而不是恰好在指定位置。 pch=4当给定一个0到18的整数时,会生成一个特殊的画图符号。通过以下的命令能够看这些符号都有什么。 > legend(locator(1), as.character(0:18), pch=0:18)lty=2 线条类型。并非全部图形设备都支持多种线条类型(在那些支持的设 备上也不全一样),只是线条类型1始终是实线,2及以上的是点、划线或者它们的组合。lwd=2 线条宽度。所需的线条宽度,是"标准"线条宽度的倍数。对line()等函数绘制的线条和坐标轴都有效果。col=2 点、线、文本、填充区和图像使用的颜色。每种图形元素都有其可用的颜色列表,这个參数的值就是颜色在列表中的序号。显然,这个參数值对有限的一类设备有效。font=2 指定文本所使用字体的一个整数。假设可能的话,设备驱动会把1相应普通文本,2相应粗体,3相应斜体,4相应粗斜体。 font.axis font.lab font.main font.sub 这几个參数分别指定坐标轴凝视,x,y轴的标签,主、副标题所用的字体。adj=-0.1 文本对齐和画图位置有关。0代表左对齐,1代表右对齐,0.5代表水平的中间位置。当前的值使会图位置到左端距离的比例,所以-0.1在文本和画图位置之间留10%的空白。cex=1.5 字符缩放。这个值是所需文本字符(包含画图字符)的大小,与默认文本大小相关。B 坐标轴和标记
非常多R的高级图形都有坐标轴,你能够使用低级图形函数axis()自己创建坐标轴。坐标轴包括三个主要组件:轴线axis line(线条类型由參数lty控制),标记tick mark(沿着轴线划分单元),标号tick label(用来标出这些单元)。这些组件能够用以下这些參数定制。lab=c(5,7,12)前两个数字各自是x和y轴上所要划分的区间数。第三个数字是坐标轴标签的长度,用字符数来衡量(包含小数点)。參数的值假设选得太小可能导致全部标号都聚在一起。las=1 坐标轴标签的方向。0代表总是和坐标轴平行,1代表总是水平的,2代表总是垂直于坐标轴。mgp=c(3,1,0)坐标轴组件的位置。第一个组件是坐标轴标签到坐标轴的距离,单位是文本行(text lines)。第二个组件是到标号的距离,最后一个是轴的巍直到轴线的距离(一般都是0)。正数代表画图区域外,负数代表区域内。tck=0.01 标号的长度,画图区域大小的一个分数作单位。当tck比較小时(小于0.5),就强制x和y轴上的标记为同样大小。tck=1就是生成网格线。取负值时标记画向画图区域外。内部标记能够使用tck=0.01和mgp=c(1,-1.5,0)。xaxs="s" yaxs="d" 各自是x、y轴的类型。假设是s(standard)或e(extended)类型,那最大和最小的标记都始终在数据区域之外。假设有某个点离边界很近,那么扩展型(extended)的轴会稍稍扩展一下。这样的类型的轴有时会在边界附近留出大片空白。而i(internal)或r(默认值)类型的轴,标记始终在数据区域内,只是r类型会在边界留出少量空白。 假设这个參数设为d,就锁定当前轴,对之后绘制的全部图形都用这个轴(直到參数被又一次设定为其它的那几个值)。这个參数适用于生成一系列固定尺度的图。C 图边缘(Figure margins)
在R中一个单独图形,图(figure),包括一个画图区(plot region),以及围绕着这个区域的边缘(当中可能含有坐标轴标签、标题等等),(通常)这两部分以轴为边界。 一个典型的图是![](https://img-my.csdn.net/uploads/201211/22/1353545933_6990.png)
D 多图环境
R同意在一页上创建一个n£m的图的阵列。每一个图由自己的边缘,图的阵列另一个可选的外部边缘,例如以下图所看到的。![](https://img-my.csdn.net/uploads/201211/22/1353545952_1166.png)
12.6 设备驱动
R差点儿能够在不论什么一种类型的显示器和打印设备上生成(不同质量的)图形。只是,在这之前,须要告诉R要处理的是哪一种设备。这通过启动一个设备驱动来完毕。
设备驱动通过调用设备驱动函数来启动。 某些经常使用的设备驱动有:X11()[Unix] 使用X11视窗系统windows()[Windows] 使用 Windows 视窗系统 postscript()在PostScript打印机上打印或者创建PostScript图形文件pictex()生成一个LATEX文件 当一个设备使用完之后,能够通过以下的命令终止设备驱动 > dev.off() 这个命令能够确保设备已经结束;比如,在某些硬拷贝的设备中,这个命令能够保证每页都已经完毕,而且都被传送到打印机了。PostScript文档
通过给postscript()函数带上file參数,我们能够把图形以PostScript格式存储到文件里。假设没有给出horizontal=FALSE參数,图形是横向的,你能够通过width和height參数控制图形的大小(图形会自己主动适应)。比如,命令 > postscript("file.ps", horizontal=FALSE, height=5, pointsize=10) 为一个五英寸的图生成一个包括PostScript代码的文件,能够放在文其中。假设命令中的指定的文件名称已经存在,将会被覆盖。多重图形设备
每一个对设备驱动的新调用都会打开一个新的图形设备,在设备列表中添�新的一项。这个设备就成为当前设备,图形输出就传送到这个设备。dev.list() 返回全部活动中设备的序号和名称。在列表位置1的设备始终是空设备(null device),这个设备不接收不论什么图形命令。dev.next() dev.prev() 分别返回当前设备的后一个和前一个设备的序号和名称。dev.set(which=k) 用来把当前设备更改为设备列表中位置k的那个。返回设备的序号和标签。dev.off(k) 终止图形列表位置k的那个图形设备。对于某些设备,比方postscript,这个命令会立马打印文件或者正常结束文件,详细如何处理取决于设备是如何初始化的。dev.copy(device,. . . ,which=k) dev.print(device,. . . ,which=k) 建立一个设备k的拷贝。当中device是一个设备函数,比如postscript,假设须要的话能够在'. . . '中指定其他的參数,dev.print效果相似,只是复制的设备会立马关闭,所以打印硬拷贝这种终止操作也会被马上运行。graphics.off() 终止列表中的全部图形设备,空设备除外。