《R软件第二讲-数据操作.ppt》由会员分享,可在线阅读,更多相关《R软件第二讲-数据操作.ppt(80页珍藏版)》请在三一办公上搜索。
1、R向量、多维数组和矩阵,1、数据表示2、应用实例3、实验练习,实验内容,实验目的,学习R中向量、多维数组和矩阵的表示方法,常量,常量为:数值型、逻辑型和字符型三种,其中数值型数据如:123,123.45,1.2345e30 字符型如:“Weight”,“李明”是字符型;逻辑真值写为T或TRUE(注意区分大小写,写t或true都没意义),逻辑假值写为F或FALSE。复数常量就用这样的写法表示。,R中的数据可以取缺失值,用符号NA代表缺失值。函数is.na(x)返回x是否缺失值(返回值T或F)。,向量(Vector)与赋值,向量是有相同基本类型的元素序列,即一维数组定义向量的最常用办法是使用函数c
2、(),它把若干个数值或字符串组合为一个向量,比如:x x 1 1 2 3 10 11 12 13 R中用符号“x1=c(1,2)和 assign(“x1”,c(1,2)相同函数length(x)可以计算向量x的长度。,向量运算,可以对向量进行加()减()乘(*)除(/)、乘方()运算,其含意是对向量的每一个元素进行运算。例如:x y=x*2+1 y 1 3.0 9.0 13.5 y2 1 9.0,%/%表示整数除法(比如5%/%3为1),%表示求余数(如5%3为2)。,可以用向量作为函数自变量,sqrt、log、exp、sin、cos、tan等函数都可以用向量作自变量,结果是对向量的每一个元素
3、取相应的函数值函数min和max分别取向量自变量的最小值和最大值,函数sum计算向量自变量的元素和,函数mean计算均值,函数var计算样本方差(分母为n-1),函数sd计算标准差如果求var(x)而x是矩阵,则结果为样本协方差阵。(行向量为观测值),负数开根号要补充成复数形式sqrt(-4)1 NaN#数值运算中,返回非数值的 非凡值 warning:sqrt(-4+0i)1 2i,sort(x)返回x的元素从小到大排序的结果向量 order(x)返回使得x从小到大排列的元素下标向量(xorder(x)等效于sort(x))。x=c(2,4,8,6,10)order(x)1 1 2 4 3
4、5 xorder(x)1 2 4 6 8 10,任何数与缺失值的运算结果仍为缺失值。例如,2*c(1,NA,2)1 2 NA 4 sum(c(1,NA,2)1 NA,最大最小值及其查询 x min(x)1 1 max(x)1 10 which.min(x)1 4 which.max(x)1 5,range(x)1 1 10,产生有规律的数列,在R中很容易产生一个等差数列。例如,1:n产生从1到n的整数列,-2:3产生从-2到3 的整数列,5:2产生反向的数列:注意优先级 1:n-1不是代表1到n-1而是向量1:n减去1,1:5-1 1 0 1 2 3 4 1:(5-1)1 1 2 3 4,se
5、q函数是更一般的等差数列函数。如只指定一个自变量n0,则seq(n)相当于1:n。指定两个自变量时,第一量是开始值,第二量是结束值,如seq(-2,3)是从-2到3,默认公差为1。,R函数调用的一个很好的特点是它可以使用不同个数的自变量,函数可以对不同类型的自变量给出不同结果,自变量可以用“自变量名自变量值”的形式指定。例如,seq(-2,3)可以写成seq(from=-2,to=3)。可以用一个by参数指定等差数列的增加值,例如:,seq(0,2,0.7)1 0.0 0.7 1.4 也可以写成 seq(from=0,to=2,by=0.7)。,参数的位置可以互换,有参数名的参数的次序任意,如
6、:seq(0,by=0.7,to=2)1 0.0 0.7 1.4 可以用length参数指定数列长度,如seq(from=10,length=5)产生10到14。seq函数还可以用一种seq(along=向量名)的格式,这时只能用这一个参数,产生该向量的下标序列,如:,x 1 1.00 4.00 6.25 seq(along=x)1 1 2 3,也可以加入by这个参数,另一个类似的函数是rep,它可以重复第一个自变量若干次,例如:rep(x,3)1 1.00 4.00 6.25 1.00 4.00 6.25 1.00 4.00 6.25 第一个参数名为x,第二个参数名为times(重复次数)。
7、rep(x,each=3)1 1.00 1.00 1.00 4.00 4.00 4.00 6.25 6.25 6.25此外numeric(n)可以产生一个长度为n的零向量,向量可以取逻辑值,如:a=c(T,T,F)a 1 TRUE TRUE FALSE 当然,逻辑向量往往是一个比较的结果,如:x b=x 3 b 1 FALSE TRUE TRUE,逻辑向量,一个向量与常量比较大小,结果还是一个向量,元素为每一对比较的结果逻辑值。两个向量也可以比较,如:log(10*x)1 2.302585 3.688879 4.135167 log(10*x)x 1 TRUE FALSE FALSE 比较运算
8、符包括,=,=,!=。,两个逻辑向量可以进行与(&)、或(|)运算,结果是对应元素运算的结果。对逻辑向量x计算!x表示取每个元素的非。例如:x=c(1,4,6.25,1.6)(x 1.5)&(x x=c(T,F,F)!x 1 FALSE TRUE TRUE判断一个逻辑向量是否都为真值的函数是all,如:all(log(10*x)x)1 FALSE 判断是否其中有真值的函数是any,如:any(log(10*x)x)1 TRUE,函数is.na(x)用来判断x的每一个元素是否缺失。如 is.na(c(1,NA,3)1 FALSE TRUE FALSE 逻辑值可以强制转换为整数值,TRUE变成1,
9、FALSE变成0。例如,age65为老年人,否则为年轻人,可以用c(“young”,“old”)(age65)+1 表示。当年龄大于65时age65等于TRUE,加1则把TRUE转换为数值型的1,结果得2,于是返回第二个下标处的“old”。否则等于0+1下标处的“young”。age=c(89,20,10,66);c(young,old)(age65)+1;1 old young young old,缺失数据NA表示缺失、NaN表示不确定的数注意下面例子的比较 x is.nan(x)1 FALSE TRUE FALSE FALSE is.na(x)1 FALSE TRUE FALSE TRUE
10、 is.finite(x)1 TRUE FALSE FALSE FALSE is.infinite(x)1 FALSE FALSE TRUE FALSE,字符型向量,向量元素可以取字符串值。例如:c1=c(x,sin(x)c1 1 x sin(x)ns=c(Weight,Height,“age)ns 1 Weight Height age paste函数用来把它的自变量连成一个字符串,中间用空格分开,例如:paste(My,Job)1 My Job paste(Hi,Good morning)1 Hi Good morning,连接的自变量可以是向量,这时各对应元素连接起来,长度不相同时较短的
11、向量被重复使用。自变量可以是数值向量,连接时自动转换成适当的字符串表示,例如:paste(c(X,Y),=,1:4)1 X=1 Y=2 X=3 Y=4 分隔用的字符可以用sep参数指定,例如:paste(result.,1:5,sep=)1 result.1 result.2 result.3 result.4 result.5 如果给paste()函数指定了collapse参数,则把字符串向量的各个元素连接成一个字符串,中间用collapse指定的值分隔。比如 paste(c(a,b),collapse=.)1 a.b,还可以和日期函数一起合并,显示当天的日历和时间paste(“Today
12、is”,date()1“Today is Mon Sep 26 9:20:35 2011”,复数向量,R支持复数运算。复数常量只要用3.5+2.1i这样的格式即可。复向量的每一个元素都是复数。Re()计算实部,Im()计算虚部,Mod()计算复数模,Arg()计算复数幅角。,complex(2)1 0+0i 0+0i complex(2,4,6)1 4+6i 4+6i complex(1,4,6)1 4+6i y=1:2+1i*(8:9)#注意这里i前面的1不能少 y 1 1+8i 2+9i Re(y)1 1 2 Im(y)1 8 9 Mod(y)1 8.062258 9.219544 Arg
13、(y)1 1.446441 1.352127,向量下标运算,某一个元素只要用xi的格式访问,其中x是一个向量名,或一个取向量值的表达式,如:x 1 1.00 4.00 6.25 x2 1 4(c(1,3,5)+5)2 1 8可以单独改变一个元素的值,例如:x2 x 1 1.00 125.00 6.25,R提供了四种方法来访问向量的一部分,格式为xv,x为向量名或向量值的表达式,v是如下的表示下标向量:一、取正整数值的下标向量 v为一个向量,取值在1到length(x)之间,取值允许重复,例如,xc(1,3)1 1.00 6.25 x1:2 1 1 125 xc(1,3,2,1)1 1.00 6
14、.25 125.00 1.00 c(a,b,c)rep(c(2,1,3),3)1 b a c b a c b a c,二、取负整数值的下标向量 v为一个向量,取值在length(x)到1之间,表示扣除相应位置的元素。例如:x-(1:2)1 6.25 x-3 1 1.00 125.00,三、取逻辑值的下标向量 v为和x等长的逻辑向量,xv表示取出所有v为真值的元素,如:,x 1 1.00 125.00 6.25 x xx xx0 1 numeric(0)#下标都是F,是个零长度的向量,逻辑值下标是一种强有力的检索工具,例如xsin(x)0可以取出x中所有正弦函数值为正的元素组成的向量。,四、取字
15、符型值的下标向量 在定义向量时可以给元素加上名字,例如:ages ages 1 Li Zhang Liu 33 29 18 ages1 1 Li 33 ages1=2#可以改变向量中字符型元素取值 ages1 1 Li 2,向量还可用元素名字来访问元素或元素子集,agesc(Li,Liu)1 Li Liu 33 18向量元素名可以后加,利用names(),例如:ages1=c(33,29,18)names(ages1)=c(Li,Zhang,Liu)ages1 1 Li Zhang Liu 33 29 18,R中还可以改变一部分元素的值,例如:x 1 1.00 125.00 6.25 xc(1
16、,3)=c(144,169)x 1 144 125 169 注意赋值的长度必须相同,例外是可以把部分元素赋为一个统一值:xc(1,3)=0 x 1 0 125 0,要把向量所有元素赋为一个相同的值而又不想改变其长度,可以用x的写法:x=0,注意这与“x=0”是不同的,前者赋值后向量长度不变,后者使向量变为标量0。改变部分元素值的技术与逻辑值下标方法结合可以定义向量的分段函数,,例如:要定义y=f(x)为当x y=numeric(length(x)yx yx=0=1+xx=0,思考:要定义y=f(x)为当x3.0时取x,3.0=x3.5 时取x+10,否则取x+20;x=c(0.5,-1,1,2
17、,3,4,1,2,3,4);求y.,x y yxy(x=3)1 0.5-1.0 1.0 2.0 13.0 24.0 1.0 2.0 13.0 24.0,对象和它的模式与属性,R是一种基于对象(object)的语言,它的对象包含了若干元素作为其数据,还有一些特殊数据称为属性(attribute),一个向量是一个对象,一个图形也是一个对象。R的对象分为单纯型(atomic)和复合型(recursive)单纯型:所有的元素都是同一种基本类型,如字符串向量,数值型向量都是单纯型 复合型:元素可以是不同类型的对象,如列表(list),可以由不同类型的对象组成其元素,元素可以以它们各自单独的方式被列出。注
18、意:空向量也有自己的模式,如:空的字符串会显示为:character(0)空的数值向量会显示为:numeric(0)R的对象还有一种特殊的空值型(null)z-NULL;#表示没有值,和NA不同,NA是有空值,NULL是 根本没有,固有属性:模式(mode)和长度(length),R的对象有两个基本的属性:类型属性(mode)和长度属性(length)。x mode(x)1“numeric”mode(x1)1“logical”length(x)1 3长度为零的向量 numeric()或者numeric(0)character()或者character(0),R允许强制转换对象的类型 x x-a
19、s.numeric(x);x 1 1.00 4.00 6.25as.开头的函数,带有强制转换类型的功能(具体可参加索引部分),R允许修改对象的长度对象的长度可以为0或正整数值 y z2 x4 x x-xc(1,3);x 1 1.00 6.25,还可以通过修改长度参数来达到目的 even even length(even);1 5 length(even)-3;1 2 4 6,特有属性:attributes()和attr(),attributes()返回对象除了mode和length以外的特有属性,如果没有特有属性,则返回NULL。fruit mode(fruit)1“numeric”attri
20、butes(fruit)$names 1 apple orange attributes(x)NULL,用attr()可以对对象的特有属性进行赋值 attr(fruit,names)fruit peanut almond 1 2 attr(fruit,type)fruit;peanut almond 1 2 attributes(fruit)$names 1 peanut almond$type 1 nut,多维数组和矩阵数组(array)和矩阵(matrix),数组(array):带多个下标的类型相同的元素的集合,常用的是数值型的数组如矩阵,也可以有其它类型(如字符型、逻辑型、复型数组)。数
21、组有一个特征属性叫做维数向量(dim属性),比如维数向量有两个元素时数组为二维数组(矩阵)。维数向量的每一个元素指定了该下标的上界,下标的下界总为1。向量只有定义了维数向量(dim属性)后才能被看作是数组。来看下面两个例子,例 a=1:24 a dim(a)=c(6,4)#a是6行4列结构的数组 a,1,2,3,4 1,1 7 13 19 2,2 8 14 20 3,3 9 15 21 4,4 10 16 22 5,5 11 17 23 6,6 12 18 24 dim(a)-24;#对a赋予dim以后,a也是数组了,按列的顺序,例 a=1:24 a dim(a)=c(2,4,3)a,1,1,
22、2,3,41,1 3 5 72,2 4 6 8,2,1,2,3,41,9 11 13 152,10 12 14 16,3,1,2,3,41,17 19 21 232,18 20 22 24,数组元素的排列次序缺省情况下是采用第一下标变化最快,最后下标变化最慢的顺序存放的;对于矩阵(二维数组)则是按列存放。例如,假设数组a的元素为1:24,维数向量为c(2,3,4),则各元素次序为a1,1,1,a2,1,1,a1,2,1,a2,2,1,a1,3,1,.,a2,3,4。用函数array()或matrix()可以更直观地定义数组。array()函数的完全使用为 array(x,dim=length(
23、x),dimnames=NULL)其中x是第一自变量,应该是一个向量,表示数组的元素值组成的向量。dim参数可省,省略时作为一维数组(但不同于向量)。dimnames属性可以省略,不省略时是一个长度与维数相同的列表,列表的每个成员为一维的名字。,比较下面几个命令:x y dim(x)NULLdim(y)1 4,z z,1,2 1,1 3 2,2 4 z-array(x,dim=c(2,2),dimnames=list(c(row1,row2),c(col1,col2);col1 col2 row1 1 3 row2 2 4,函数matrix():用于构造二维数组,即矩阵。格式为 matrix(
24、data=NA,nrow=1,ncol=1,byrow=FALSE,dimnames=NULL)其中第一自变量data为数组的数据向量(缺省值为缺失值NA),nrow为行数,ncol为列数,byrow表示数据填入矩阵时按行次序还是列次序,缺省情况下按列次序。dimnames缺省是空值,否则是一个长度为2的列表,列表第一个成员是长度与行数相等的字符型向量,表示每行的标签,列表第二个成员是长度与列数相同的字符型向量,表示每列的标签。例如,定义一个3行4列,由1:12按行次序排列的矩阵,可以用:,b-matrix(1:12,ncol=4,byrow=T);b,1,2,3,4 1,1 2 3 4 2,
25、5 6 7 8 3,9 10 11 12 b-matrix(1:12,ncol=4);b,1,2,3,4 1,1 4 7 10 2,2 5 8 11 3,3 6 9 12,注意:在有数据的情况下只需指定行数或列数之一。指定的数据个数允许少于所需的数据个数,这时循环使用提供的数据。例如:b b-matrix(c(1,3),nrow=3,ncol=4);,1,2,3,41,1 3 1 32,3 1 3 13,1 3 1 3,数组下标,访问数组的某个元素,写出数组名和方括号内用逗号分开的下标即可,如a2,1,2。a dim(a)a2,1,2 1 9在每一个下标位置写一个下标向量,表示对这一维取出所有
26、指定下标的元素,如a1,2:3,2:3取出所有第一下标为1,第二下标为2或3,第三下标为2或3的元素。a1,2:3,2:3,1,2 1,11 19 2,13 21,略写某一维的下标,则表示该维全选。a1,1,2,3 1,1 9 17 2,3 11 19 3,5 13 21 4,7 15 23 a,2,1,2,3 1,3 11 19 2,4 12 20a,或a都表示整个数组。a=0 把元素都赋成0。还有一种特殊下标是对于数组只用一个下标向量(是向量,不是数组),比如a3:4,这时忽略数组的维数信息,把下标表达式看作是对数组的数据向量取子集。a3:4 1 3 4,不规则数组下标,可以把数组中的任意
27、位置的元素作为一组访问,其方法是用一个矩阵作为数组的下标,例如,我们要把上面的形状为c(2,4,3)的数组a的第1,1,1,2,2,3,1,4,3,2,4,1号共四个元素作为一个整体访问,先定义一个包含这些下标作为行的二维数组:b=matrix(c(1,1,1,2,2,3,1,4,3,2,4,1),ncol=3,byrow=T)b ab 1 1 20 23 8 x1 x2 x1+x2 1 101 202 103 204 105 206 x3 x3 x1+x3,1,21,101 2042,202 1053,103 206,数组四则运算,数组可以进行四则运算(+,,*,/,),解释为数组对应元素的
28、四则运算,参加运算的数组一般应该是相同形状的(dim属性完全相同)。例如,假设A,B,C是三个形状相同的数组,则 D-C+2*A/B 形状不一致的向量和数组也可以进行四则运算,一般的规则是数组的数据向量对应元素进行运算,把短的循环使用来与长的匹配,并尽可能保留共同的数组属性。例如:不规则运算 除非你清楚地知道规则,否则应避免使用这样的办法。,矩阵运算,矩阵是二维数组,应用广泛函数t(A)返回矩阵A的转置。nrow(A)为矩阵A的行数,ncol(A)为矩阵A的列数。矩阵之间进行普通的加减乘除四则运算,即数组的对应元素之间进行运算,所以注意A*B不是矩阵乘法而是矩阵对应元素相乘。要进行矩阵乘法,使
29、用运算符%*%,A%*%B表示矩阵A乘以矩阵B(当然要求A的列数等于B的行数)。例如:A B A%*%B,另外,向量用在矩阵乘法中可以作为行向量看待也可以作为列向量看待,这要看哪一种观点能够进行矩阵乘法运算。例如,设x是一个长度为n的向量,A是一个n*n 矩阵,则“x%*%A%*%x”表示二次型。但是,有时向量在矩阵乘法中的地位并不清楚,比如“x%*%x”就既可能表示内积,也可能表示n*n 阵。因为前者较常用,所以R选择表示前者,但内积最好还是用crossprod(x)来计算。要表示 n*n阵,可以用“cbind(x)%*%x”或“x%*%rbind(x)”。函数crossprod(X,Y)表
30、示一般的交叉乘积(内积),即X的每一列与Y的每一列的内积组成的矩阵。如果X和Y都是向量则是一般的内积。只写一个参数X的crossprod(X)计算X自身的内积。,其它矩阵运算还有solve(A,b)解线性方程组,solve(A)求方阵A的逆矩阵,svd()计算奇异值分解,qr()计算QR分解,eigen()计算特征向量和特征值。详见随机帮助,例如:?qr函数diag()的作用依赖于其自变量。diag(vector)返回以自变量(向量)为主对角元素的对角矩阵。diag(matrix)返回由矩阵的主对角元素组成的向量。diag(k)(k为标量)返回k阶单位阵。,x=1:3 x 1 1 2 3 cr
31、ossprod(x),1 1,14 cbind(x)%*%x,1,2,3 1,1 2 3 2,2 4 6 3,3 6 9 x%*%rbind(x),1,2,3 1,1 2 3 2,2 4 6 3,3 6 9,y=diag(x)y,1,2,3 1,1 0 0 2,0 2 0 3,0 0 3 diag(y)1 1 2 3 diag(3),1,2,3 1,1 0 0 2,0 1 0 3,0 0 1,A b x A.inverse det(A)1-3,svd.A-svd(A);svd.A#A=UDV,U、V正交阵,D 为对角阵$d#奇异阵对角线的元素1 17.4125052 0.8751614 0.1
32、968665$u,1,2,31,-0.2093373 0.96438514 0.16167622,-0.5038485 0.03532145-0.86306963,-0.8380421-0.26213299 0.4785099$v,1,2,31,-0.4646675-0.833286355 0.29952952,-0.5537546 0.009499485-0.83262583,-0.6909703 0.552759994 0.4658502,attach(svdA)u%*%diag(d)%*%t(v),1,2,3 1,1 2 3 2,4 5 6 3,7 8 10,矩阵合并与拉直,函数cbin
33、d()把其自变量横向拼成一个大矩阵,rbind()把其自变量纵向拼成一个大矩阵。cbind()的自变量是矩阵或者看作列向量的向量,自变量的高度应该相等(对于向量,高度即长度,对于矩阵,高度即行数)。rbind的自变量是矩阵或看作行向量的向量,自变量的宽度应该相等(对于向量,宽度即长度,对于矩阵,宽度即列数)。如果参与合并的自变量比其它自变量短则循环补足后合并。例如:,x1=rbind(c(1,2),c(3,4)x1,1,2 1,1 2 2,3 4 x2 x3 x3,1,2,3,4 1,1 2 11 12 2,3 4 13 14,x4=rbind(x1,x2)x4,1,2 1,1 2 2,3 4
34、 3,11 12 4,13 14 cbind(1,x1),1,2,3 1,1 1 2 2,1 3 4,设a是一个数组,要把它转化为向量(去掉dim和dimnames属性),只要用函数as.vector(a)返回值就可以了(注意函数只能通过函数值返回结果而不允许修改它的自变量,比如t(X)返回X的转置矩阵而X本身并未改变)。另一种由数组得到其数据向量的简单办法是使用函数c(),例如c(a)的结果是a的数据向量。这样的另一个好处是c()允许多个自变量,它可以把多个自变量都看成数据向量连接起来。例如,设A和B是两个矩阵,则c(A,B)表示把A按列次序拉直为向量并与把B按列次序拉直为向量的结果连接起来
35、。一定注意拉直时是按列次序拉直的。,a=rbind(c(1,2),c(3,4)a,1,2 1,1 2 2,3 4 as.vector(a)1 1 3 2 4#按列拉直 b=t(a)b,1,2 1,1 3 2,2 4 c(a,b)1 1 3 2 4 1 2 3 4#按列拉直,数组的维名字,数组可以有一个属性dimnames保存各维的各个下标的名字,缺省时为NULL(即无此属性)。以矩阵为例,它有两个维:行维和列维。比如,设x为2行3列矩阵,它的行维可以定义一个长度为2的字符向量作为每行的名字,它的列维可以定义一个长度为3的向量作为每列的名字,属性dimnames是一个列表,列表的每个成员是一个维
36、名字的字符向量或NULL。例如:x x First Second one 1 2 two 3 4 three 5 6,我们也可以先定义矩阵x然后再为dimnames(x)赋值。对于矩阵,我们还可以使用属性rownames和colnames来访问行名和列名。在定义了数组的维名后我们对这一维的下标就可以用它的名字来访问,,x rownames(x)colnames(x)x 第一列 第二列第一行 1 2第二行 3 4第三行 5 6,x第一行,第二列 1 2 x第一行,第一列 第二列 1 2 x,第二列 第一行 第二行 第三行 2 4 6,数组的外积,两个数组a和b的外积是由a的每一个元素与b的每一个
37、元素搭配在一起相乘得到一个新元素,这样得到一个维数向量等于a的维数向量与b的维数向量连起来的数组,a b a%o%b,1,2,3 1,2 5 7 2,4 10 14 3,6 15 21 注意:b%o%a=t(a%o%b),即若d为a和b的外积,则dim(d)=c(dim(a),dim(b)。a和b的外积记作 a%o%b。如 d d outer(a,b,+),1,2,31,3 6 82,4 7 93,5 8 10,例如,我们希望计算函数 在一个x和y的网格上的值用来绘制三维曲面图,可以用如下方法生成网格及函数值:x y f z-outer(x,y,f)persp(x,y,z)用这个一般函数可以很
38、容易地把两个数组的所有元素都两两组合一遍进行指定的运算。,例子:考虑简单的22矩阵,其元素均在0,1,.,9中取值。假设四个元素 a,b,c,d都是相互独立的服从离散均匀分布的随机变量,我们设法求矩阵行列式 ad-bc的分布。首先,随机变量 ad和 bc同分布,它的取值由以下外积矩阵给出,每一个取值的概率均为1/100:x y-outer(x,x,“-”)#两者想减的各种可能这样得到一个维数向量为c(10,10,10,10)的四维数组,每一个元素为行列式的一个可能取值,概率为万分之一。因为这些取值中有很多重复,我们可以用一个table()函数来计算每一个值的出现次数(频数):,f plot(a
39、s.numeric(names(f),f,type=h,xlab=“行列式值,ylab=频数)其中as.numeric()把向量f中的元素名又转换成了数值型,用来作为作图的横轴坐标,f 中的元素值即频数作为纵轴,type=h表示是画垂线型图。,plot(as.numeric(names(f),f,type=h,xlab=行列式值,ylab=频数),plot(as.numeric(names(f),f/10000,type=h,xlab=行列式值,ylab=频率),数组的广义转置,可以用aperm(a,perm)函数把数组a的各维按perm中指定的新次序重新排列。例如:a b c-aperm(a
40、,c(2,1),a=array(1:12,dim=c(2,3,2)a,1,1,2,3 1,1 3 5 2,2 4 6,2,1,2,3 1,7 9 11 2,8 10 12,aperm(a,c(3,2,1),1,1,2,3 1,1 3 5 2,7 9 11,2,1,2,3 1,2 4 6 2,8 10 12,aperm(a,c(2,1,3),1,1,2 1,1 2 2,3 4 3,5 6,2,1,2 1,7 8 2,9 10 3,11 12,apply函数,对于向量,我们有sum、mean等函数对其进行计算。对于数组,如果我们想对其中一维(或若干维)进行某种计算,可以用apply函数。其一般形式
41、为:apply(X,MARGIN,FUN,.)其中X为一个数组,MARGIN是固定哪些维不变,FUN是用来计算的函数。例如,设a是n*m 矩阵,则apply(a,1,sum)的意义是对a的各行求和(保留第一维即第一个下标不变),结果是一个长度为n的向量(与第一维长度相同),而apply(a,2,sum)意义是对a的各列求和,结果是一个长度为m的向量(与第二维长度相同)。,a,1,2 1,4 3 2,9 7 3,1 2 apply(a,2,sum)1 14 12 apply(a,1,sum)1 7 16 3 apply(a,2,sort),1,2 1,1 2 2,4 3 3,9 7,apply(
42、a,1,sort),1,2,3 1,3 7 1 2,4 9 2 t(apply(a,1,sort),1,2 1,3 4 2,7 9 3,1 2,apply(a,2,sort)但是,如果要对行排序,则apply(a,1,sort)把a的每一行3个元素排序后的结果用第一维来引用,结果的维向量为c(N,dim(a)1)=c(3,4),把原来的列变成了行,所以t(apply(a,1,sort)才是对a的每一行排序的结果。如:apply(a,1,sort)t(apply(a,1,sort),实验练习,1、六个元素 a,b,c,d,e,f都是相互独立的服从离散均匀分布的随机变量,其元素均在1,.,9中取值
43、。设法求ade-bcf 的分布。要求(1)产生一个外积矩阵;(2)用一个table()函数来估计每一个值的出现概率;(3)绘制一个频数分布图,一个频率分布图。,2.(1)写出元素为3,-1.5,3E-10的向量。(2)写出从3开始每次增加3,长度为100的向量。(3)写出(0,2)重复10次的向量。(4)对向量x,写出其元素大于等于0小于1的条件。(5)对向量x,写出其元素都等于0的条件。(6)写出包含12个月份名称的向量。,3.设x为一个长100的整数向量。比如,x-floor(10*runif(100)。(1)显示x第21到30号元素。(2)把x第31,35,39号元素赋值为0。(3)显示x中除了第1号和第50号的元素之外的子集。(4)列出x中个位数等于3的元素。(5)列出x中个位数等于3的元素的下标位置。(6)给x的每一个元素加上名字,为x1到x100。(7)求x的平均值并求每一个元素减去平均值后的离差,计算x元素的平方和及离差平方和。,4.定义一个维数为(3,4,2)的数组其第一层(第三下标为1)取从1开始的奇数,第二层取从2开始的偶数。显示每一层的第2行元素。把第(1,1,1),(2,2,2),(2,2,1)号元素赋值为零。把第一层加上100,把第二层加上200。分别计算第一层和第二层的平均值。5.试画出任一给定的二元正态分布的密度函数图形。,