R语言入门向量、多维数组和矩阵.ppt

上传人:牧羊曲112 文档编号:6518017 上传时间:2023-11-08 格式:PPT 页数:69 大小:506.50KB
返回 下载 相关 举报
R语言入门向量、多维数组和矩阵.ppt_第1页
第1页 / 共69页
R语言入门向量、多维数组和矩阵.ppt_第2页
第2页 / 共69页
R语言入门向量、多维数组和矩阵.ppt_第3页
第3页 / 共69页
R语言入门向量、多维数组和矩阵.ppt_第4页
第4页 / 共69页
R语言入门向量、多维数组和矩阵.ppt_第5页
第5页 / 共69页
点击查看更多>>
资源描述

《R语言入门向量、多维数组和矩阵.ppt》由会员分享,可在线阅读,更多相关《R语言入门向量、多维数组和矩阵.ppt(69页珍藏版)》请在三一办公上搜索。

1、实验目的,实验内容,学习S语言中向量、多维数组和矩阵的表示方法,1、数据表示2、应用实例3、实验作业,S向量、多维数组和矩阵,S语言是基于对象(Object)的语言 基本的数据类型有:向量、矩阵、列表等 复杂的数据对象有:数据框对象,时间序列对象,模型对象,图形对象,等等。,S语言表达式可以使用常量和变量。变量名:由字母、数字、句点组成,第一个字符必须是字母,长度没有限制,但区分大小写。特别要注意句点可以作为名字的合法部分。,常量,常量为:数值型、逻辑型和字符型三种,其中数值型数据又可以分为整型、单精度、双精度等 例如,123,123.45,1.2345e30 是数值型常量;“Weight”,

2、“李明”是字符型;逻辑真值写为T或TRUE(注意区分大小写,写t或true都没意义),逻辑假值写为F或FALSE。复数常量就用3.5-2.1i这样的写法表示。,S中的数据可以取缺失值,用符号NA代表缺失值。函数is.na(x)返回x是否缺失值(返回值T或F)。,向量(Vector)与赋值,向量是有相同基本类型的元素序列,即一维数组定义向量的最常用办法是使用函数c(),它把若干个数值或字符串组合为一个向量,比如:x=c(1:3,10:13)x 1 1 2 3 10 11 12 13 S中用符号“x1=c(1,2)和 assign(“x1”,c(1,2)相同函数length(x)可以计算向量x的长

3、度。,向量运算,可以对向量进行加()减()乘(*)除(/)、乘方()运算,其含意是对向量的每一个元素进行运算。例如:x y=x*2+1 y 1 3.0 9.0 13.5,%/%表示整数除法(比如5%/%3为1),%表示求余数(如5%3为2)。,可以用向量作为函数自变量,sqrt、log、exp、sin、cos、tan等函数都可以用向量作自变量,结果是对向量的每一个元素取相应的函数值函数min和max分别取向量自变量的最小值和最大值,函数sum计算向量自变量的元素和,函数mean计算均值,函数var计算样本方差(分母为n-1),函数sd计算标准差(在Splus中用sqrt(var()计算)如果求

4、var(x)而x是矩阵,则结果为样本协方差阵。(行向量为观测值),随机向量,记 X=(X1,X2,Xp)为 p 维随机向量,对 X=(X1,X2,Xp)进行一次观测,得观测值:(x11,x12,x1p)=X(1),它是一个样品。,对 X=(X1,X2,Xp)进行观测n次,得n个样品:X(i)=(xi1,x i 2,x i p),i=1,n 它是一个样本.用矩阵记为如下,称为样本数据阵.,多元总体样本的数字特征,其中,(1)样本均值向量 X:,多元总体样本的数字特征,其中,(2)样本离差阵(又称交叉乘积阵)A:,(3)样本协方差阵 S:,多元总体样本的数字特征,其中,称为变量X i 的样本方差;

5、样本方差的平方根 称为变量X i 的样本标准差.,si i,(4)样本相关阵R:,多元总体样本的数字特征,其中,sort(x)返回x的元素从小到大排序的结果向量 order(x)返回使得x从小到大排列的元素下标向量(xorder(x)等效于sort(x))。x=c(2,4,8,6,10)order(x)1 1 2 4 3 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,产生有规律的数列,在S中很容易产生一个等差数列。例如,1:n产生从1到n的整数列,-2:3产生从-2到3 的整

6、数列,5:2产生反向的数列:注意 1:n-1不是代表1到n-1而是向量1:n减去1,1:n-1 1 0 1 2 3 4 1:(n-1)1 1 2 3 4,seq函数是更一般的等差数列函数。如只指定一个自变量n0,则seq(n)相当于1:n。指定两个自变量时,第一量是开始值,第二量是结束值,如seq(-2,3)是从-2到3,默认公差为1。,S函数调用的一个很好的特点是它可以使用不同个数的自变量,函数可以对不同类型的自变量给出不同结果,自变量可以用“自变量名自变量值”的形式指定。例如,seq(-2,3)可以写成seq(from=-2,to=3)。可以用一个by参数指定等差数列的增加值,例如:,se

7、q(0,2,0.7)1 0.0 0.7 1.4 也可以写成seq(from=0,to=2,by=0.7)。,有参数名的参数的次序任意,如: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,另一个类似的函数是rep,它可以重复第一个自变量若干次,例如:rep(x,3)1 1.00 4.00 6.25 1.

8、00 4.00 6.25 1.00 4.00 6.25 第一个参数名为x,第二个参数名为times(重复次数)。此外numeric(n)可以产生一个长度为n的零向量,逻辑向量,向量可以取逻辑值,如:l=c(T,T,F)l输出1 TRUE TRUE FALSE 当然,逻辑向量往往是一个比较的结果,如:x 输出 1 1.00 4.00 6.25 l=x 3 l 输出 1 FALSE TRUE TRUE,一个向量与常量比较大小,结果还是一个向量,元素为每一对比较的结果逻辑值。两个向量也可以比较,如:log(10*x)1 2.302585 3.688879 4.135167 log(10*x)x 输出

9、1 TRUE FALSE FALSE 比较运算符包括,=,=,!=。,逻辑向量,两个逻辑向量可以进行与(&)、或(|)运算,结果是对应元素运算的结果。对逻辑向量x计算!x表示取每个元素的非。例如:x=c(1,4,6.25,1.6)(x 1.5)&(x 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,FALSE变成0。例如,age65为老年人

10、,否则为年轻人,可以用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,字符型向量,向量元素可以取字符串值。例如:c1=c(x,sin(x)c1 输出 1 x sin(x)ns=c(Weight,Height,年龄)ns 输出1 Weight Height 年龄 paste函数用来把它的自变量连成一个字符串,

11、中间用空格分开,例如:paste(My,Job)1 My Job paste(Hi,早)输出1 Hi 早,连接的自变量可以是向量,这时各对应元素连接起来,长度不相同时较短的向量被重复使用。自变量可以是数值向量,连接时自动转换成适当的字符串表示,例如: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参数,则把字符串向量的各个元素连接成一个字符串,中

12、间用collapse指定的值分隔。比如 paste(c(a,b),collapse=.)得到a.b。,复数向量,S支持复数运算。复数常量只要用3.5+2.1i这样的格式即可。复向量的每一个元素都是复数。可以用complex()函数生成复向量(见帮助)。Re()计算实部,Im()计算虚部,Mod()计算复数模,Arg()计算复数幅角。,complex package:base R DocumentationComplex VectorsDescription:Basic functions which support complex arithmetic in R.Usage:complex(l

13、ength.out=0,real=numeric(),imaginary=numeric(),modulus=1,argument=0)plex(x,.)plex(x)Re(x)Im(x)Mod(x)Arg(x)Conj(x)Arguments:length.out:numeric.Desired length of the output vector,inputs being recycled as needed.real:numeric vector.imaginary:numeric vector.modulus:numeric vector.,argument:numeric vect

14、or.x:an object,probably of mode complex.:further arguments passed to or from other methods.Details:Complex vectors can be created with complex.The vector can be specified either by giving its length,its real and imaginary parts,or modulus and argument.(Giving just the length generates a vector of co

15、mplex zeroes.)plex attempts to coerce its argument to be of complex type:like as.vector it strips attributes including names.Note that plex and is.numeric are never both TRUE.The functions Re,Im,Mod,Arg and Conj have their usual interpretation as returning the real part,imaginary part,modulus,argume

16、nt and complex conjugate for complex values.Modulus and argument are also called the _polar coordinates_.If z=x+i y with real x and y,Mod(z)=sqrtx2+y2,and for phi=Arg(z),x=cos(phi)and y=sin(phi).They are all generic functions:methods can be defined for them individually or via the Complex group gene

17、ric.In addition,the elementary trigonometric,logarithmic and exponential functions are available for complex values.plex is generic:you can write methods to handle specific classes of objects,see InternalMethods.,References:Becker,R.A.,Chambers,J.M.and Wilks,A.R.(1988)_The New S Language_.Wadsworth&

18、Brooks/Cole.Examples:0i(-3:3)matrix(1i(-6:5),nr=4)#-all columns are the same 0 1i#a complex NaN#create a complex normal vector z-complex(real=rnorm(100),imag=rnorm(100)#or also(less efficiently):z2-1:2+1i*(8:9),complex(2)1 0+0i 0+0i complex(2,4,6)1 4+6i 4+6i complex(1,4,6)1 4+6iy=1:2+1i*(8:9)y 1 1+8

19、i 2+9i Re(y)1 1 2 Im(y)1 8 9 Mod(y)1 8.062258 9.219544 Arg(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,S提供了四种方法来访问向量的一部分,格式为xv,x为向量名或向量值的表达式,v是如下的表示下标向量:一、取正整数值的下标向量 v为一个向量,取值在1到length(x)之间,取值允

20、许重复,例如,xc(1,3)1 1.00 6.25 x1:2 1 1 125 xc(1,3,2,1)1 1.00 6.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,三、取逻辑值的下标向量 v为和x等长的逻辑向量,xv表示取出所有v为真值的元素,如:,x 输出:1 1.00 125.00 6.25 x xx xx0 输出:numeric(0),可见xx0可以取出x中所有正弦函数值为正的元素组成的向

21、量。,如果下标都是假值则结果是一个零长度的向量,显示为numeric(0)。,四、取字符型值的下标向量 在定义向量时可以给元素加上名字,例如:ages ages 输出:Li Zhang Liu 33 29 18 ages1 输出:Li 33 ages1=2 ages1 输出:Li 2 向量还可用元素名字来访问元素或元素子集,例如:agesc(Li,Liu)输出:Li Liu 33 18,向量元素名可以后加,例:ages1=c(33,29,18)names(ages1)=c(Li,Zhang,Liu)ages1 输出 Li Zhang Liu 33 29 18 S中还可以改变一部分元素的值,例如

22、:x 1 1.00 125.00 6.25 xc(1,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,

23、否则取x+20;x=c(0.5,-1,1,2,3,4,1,2,3,4);求y.,x=c(0.5,-1,1,2,3,4,1,2,3,4);y=numeric(length(x);yx=3),多维数组和矩阵数组(array)和矩阵(matrix),数组(array)带多个下标的类型相同的元素的集合,常用的是数值型的数组如矩阵,也可以有其它类型(如字符型、逻辑型、复型数组)。数组有一个特征属性叫做维数向量(dim属性),比如维数向量有两个元素时数组为二维数组(矩阵)。维数向量的每一个元素指定了该下标的上界,下标的下界总为1。一组值只有定义了维数向量(dim属性)后才能被看作是数组。比如:a=1:24

24、 a dim(a)=c(2,4,3)a,数组(array)和矩阵(matrix),数组元素的排列次序缺省情况下是采用FORTRAN的数组元素次序(按列次序),即第一下标变化最快,最后下标变化最慢,对于矩阵(二维数组)则是按列存放。例如,假设数组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(x),dimnames=NULL),其中x是第一自变量,应该是一个向量,表示数

25、组的元素值组成的向量。dim参数可省,省略时作为一维数组(但不同于向量)。dimnames属性可以省略,不省略时是一个长度与维数相同的列表(list,见后面),列表的每个成员为一维的名字。,函数matrix():二维数组,即矩阵。格式为 matrix(data=NA,nrow=1,ncol=1,byrow=FALSE,dimnames=NULL)其中第一自变量data为数组的数据向量(缺省值为缺失值NA),nrow为行数,ncol为列数,byrow表示数据填入矩阵时按行次序还是列次序,缺省情况下按列次序。dimnames缺省是空值,否则是一个长度为2的列表,列表第一个成员是长度与行数相等的字符

26、型向量,表示每行的标签,列表第二个成员是长度与列数相同的字符型向量,表示每列的标签。例如,定义一个3行4列,由1:12按行次序排列的矩阵,可以用:b-matrix(1:12,ncol=4,byrow=T),b b,1,2,3,4 1,1 2 3 4 2,5 6 7 8 3,9 10 11 12 注意在有数据的情况下只需指定行数或列数之一。指定的数据个数允许少于所需的数据个数,这时循环使用提供的数据。例如:b-matrix(0,nrow=3,ncol=4)生成3行4列的元素都为0的矩阵。,数组下标,访问数组的某个元素,写出数组名和方括号内用逗号分开的下标即可,如a2,1,2。在每一个下标位置写一

27、个下标向量,表示对这一维取出所有指定下标的元素,如a1,2:3,2:3取出所有第一下标为1,第二下标为2或3,第三下标为2或3的元素。略写某一维的下标,则表示该维全选。a,或a都表示整个数组。a=0 把元素都赋成0。还有一种特殊下标是对于数组只用一个下标向量(是向量,不是数组),比如a3:4,这时忽略数组的维数信息,把下标表达式看作是对数组的数据向量取子集。,不规则数组下标,可以把数组中的任意位置的元素作为一组访问,其方法是用一个矩阵作为数组的下标,例如,我们要把上面的形状为c(2,3,4)的数组a的第1,1,1,2,2,3,1,3,4,2,1,4号共四个元素作为一个整体访问,先定义一个包含这

28、些下标作为行的二维数组:b=matrix(c(1,1,1,2,2,3,1,3,4,2,1,4),ncol=3,byrow=T)b ab x1 x2 x1+x2 x3 x3 x1+x3,数组四则运算,数组可以进行四则运算(+,,*,/,),解释为数组对应元素的四则运算,参加运算的数组一般应该是相同形状的(dim属性完全相同)。例如,假设A,B,C是三个形状相同的数组,则 D-C+2*A/B四则运算遵循通常的优先级规则。形状不一致的向量和数组也可以进行四则运算,一般的规则是数组的数据向量对应元素进行运算,把短的循环使用来与长的匹配,并尽可能保留共同的数组属性。例如:不规则运算 除非你清楚地知道规则

29、,否则应避免使用这样的办法(标量与数组或向量的四则运算除外)。,矩阵运算,矩阵是二维数组,应用广泛函数t(A)返回矩阵A的转置。nrow(A)为矩阵A的行数,ncol(A)为矩阵A的列数。矩阵之间进行普通的加减乘除四则运算,即数组的对应元素之间进行运算,所以注意A*B不是矩阵乘法而是矩阵对应元素相乘。要进行矩阵乘法,使用运算符%*%,A%*%B表示矩阵A乘以矩阵B(当然要求A的列数等于B的行数)。例如:A B A,另外,向量用在矩阵乘法中可以作为行向量看待也可以作为列向量看待,这要看哪一种观点能够进行矩阵乘法运算。例如,设x是一个长度为n的向量,A是一个n*n 矩阵,则“x%*%A%*%x”表

30、示二次型。但是,有时向量在矩阵乘法中的地位并不清楚,比如“x%*%x”就既可能表示内积,也可能表示n*n 阵。因为前者较常用,所以S选择表示前者,但内积最好还是用crossprod(x)来计算。要表示 n*n阵,可以用“cbind(x)%*%x”或“x%*%rbind(x)”。函数crossprod(X,Y)表示一般的交叉乘积(内积),即X的每一列与Y的每一列的内积组成的矩阵。如果X和Y都是向量则是一般的内积。只写一个参数X的crossprod(X)计算X自身的内积。,其它矩阵运算还有solve(A,b)解线性方程组,solve(A)求方阵A的逆矩阵,svd()计算奇异值分解,qr()计算QR

31、分解,eigen()计算特征向量和特征值。详见随机帮助,例如:?qr函数diag()的作用依赖于其自变量。diag(vector)返回以自变量(向量)为主对角元素的对角矩阵。diag(matrix)返回由矩阵的主对角元素组成的向量。diag(k)(k为标量)返回k阶单位阵。,x=1:3 x 1 1 2 3 crossprod(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

32、 diag(y)1 1 2 3 diag(3),1,2,3 1,1 0 0 2,0 1 0 3,0 0 1,矩阵合并与拉直,函数cbind()把其自变量横向拼成一个大矩阵,rbind()把其自变量纵向拼成一个大矩阵。cbind()的自变量是矩阵或者看作列向量的向量,自变量的高度应该相等(对于向量,高度即长度,对于矩阵,高度即行数)。rbind的自变量是矩阵或看作行向量的向量,自变量的宽度应该相等(对于向量,宽度即长度,对于矩阵,宽度即列数)。如果参与合并的自变量比其它自变量短则循环补足后合并。例如:,x1=rbind(c(1,2),c(3,4)x1,1,2 1,1 2 2,3 4 x2 x3

33、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 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()允许多个自变量,它可以把多个

34、自变量都看成数据向量连接起来。例如,设A和B是两个矩阵,则c(A,B)表示把A按列次序拉直为向量并与把B按列次序拉直为向量的结果连接起来。一定注意拉直时是按列次序拉直的。,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的字符向量作为

35、每行的名字,它的列维可以定义一个长度为3的向量作为每列的名字,属性dimnames是一个列表,列表的每个成员是一个维名字的字符向量或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

36、 2 x,第二列 第一行 第二行 第三行 2 4 6,数组的外积,两个数组a和b的外积是由a的每一个元素与b的每一个元素搭配在一起相乘得到一个新元素,这样得到一个维数向量等于a的维数向量与b的维数向量连起来的数组,即若d为a和b的外积,则dim(d)=c(dim(a),dim(b)。a和b的外积记作 a%o%b。如 d d-outer(a,b,*)注意outer(a,b,f)是一个一般性的外积函数,它可以把a的任一个元素与b的任意一个元素搭配起来作为f的自变量计算得到新的元素值,外积是两个元素相乘的情况。函数当然也可以是加、减、除,或其它一般函数。当函数为乘积时可以省略不写。,数组的外积,例如

37、,我们希望计算函数 在一个x和y的网格上的值用来绘制三维曲面图,可以用如下方法生成网格及函数值:x y f z-outer(x,y,f)persp(x,y,z)用这个一般函数可以很容易地把两个数组的所有元素都两两组合一遍进行指定的运算。,例子:考虑简单的22矩阵,其元素均在0,1,.,9中取值。假设四个元素 a,b,c,d都是相互独立的服从离散均匀分布的随机变量,我们设法求矩阵行列式 ad-bc的分布。首先,随机变量 ad和 bc同分布,它的取值由以下外积矩阵给出,每一个取值的概率均为1/100:x y-outer(x,x,-)这样得到一个维数向量为c(10,10,10,10)的四维数组,每一

38、个元素为行列式的一个可能取值,概率为万分之一。因为这些取值中有很多重复,我们可以用一个table()函数来计算每一个值的出现次数(频数):,f plot(as.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=行列

39、式值,ylab=频率),数组的广义转置,可以用aperm(a,perm)函数把数组a的各维按perm中指定的新次序重新排列。例如:a b c-aperm(a,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,

40、apply函数,对于向量,我们有sum、mean等函数对其进行计算。对于数组,如果我们想对其中一维(或若干维)进行某种计算,可以用apply函数。其一般形式为:apply(X,MARGIN,FUN,.)其中X为一个数组,MARGIN是固定哪些维不变,FUN是用来计算的函数。例如,设a是n*m 矩阵,则apply(a,1,sum)的意义是对a的各行求和(保留第一维即第一个下标不变),结果是一个长度为3的向量(与第一维长度相同),而apply(a,2,sum)意义是对a的各列求和,结果是一个长度为4的向量(与第二维长度相同)。,如果函数FUN的结果是一个标量,MARGIN只有一个元素,则apply

41、的结果是一个向量,其长度等于MARGIN指定维的长度,相当于固定MARGIN指定的那一维的每一个值而把其它维取出作为子数组或向量送入FUN中进行运算。如果MARGIN指定了多个维,则结果是一个维数向量等于dim(X)MARGIN的数组。如果函数FUN的结果是一个长度为N的向量,则结果是一个维数向量等于c(N,dim(X)MARGIN)的数组,注意这时不论是对哪一维计算,结果都放在了第一维。所以,若我们要把43矩阵a的3列分别排序,只要用apply(a,2,sort),这样对每一列排序得到一个长度为4的向量,用第一维来引用,结果的维向量为c(N,dim(a)2)=c(4,3),保留了列维,恰好得

42、到所需结果,运行如下例:a-cbind(c(4,9,1),c(3,7,2),a=cbind(c(4,9,1),c(3,7,2)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(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个元素

43、排序后的结果用第一维来引用,结果的维向量为c(N,dim(a)1)=c(3,4),把原来的列变成了行,所以t(apply(a,1,sort)才是对a的每一行排序的结果。如:apply(a,1,sort)t(apply(a,1,sort)上面我们只用了矩阵(二维数组)作为例子讲解apply的用法。实际上,apply可以用于任意维数的数组,函数FUN也可以是任意可以接收一个向量或数组作为第一自变量的函数。比如,设x是一个维数向量为c(2,3,4,5)的数组,则apply(x,c(1,3),sum)可以产生一个2行4 列的矩阵,其每一元素是x中固定第1维和第3维下标取出子数组求和的结果。,实验作业,

44、1、六个元素 a,b,c,d,e,f都是相互独立的服从离散均匀分布的随机变量,其元素均在1,.,9中取值。设法求ade-bcf 的分布。要求(1)产生一个外积矩阵;(2)用一个table()函数来估计每一个值的出现概率;(3)绘制一个频数分布图,一个频率分布图。,要求:需给出程序、结果,存成word文档 发送到 ftp:/10.108.6.252 用户名:r 密码:123456,2.(1)写出元素为3,-1.5,3E-10的向量。(2)写出从3开始每次增加3,长度为100的向量。(3)写出(0,2)重复10次的向量。(4)对向量x,写出其元素大于等于0小于1的条件。(5)对向量x,写出其元素都

45、等于0的条件。(6)写出包含12个月份名称的向量。(7)写出包含方程 的根的向量,并写出其幅角的余弦和正弦值。,3.设x为一个长100的整数向量。比如,x-floor(100*runif(100)。(1)显示x第21到30号元素。(2)把x第31,35,39号元素赋值为0。(3)显示x中除了第1号和第50号的元素之外的子集。(4)列出x中个位数等于3的元素。(5)列出x中个位数等于3的元素的下标位置。Hint:use which()(6)给x的每一个元素加上名字,为x1到x100。(7)求x的平均值并求每一个元素减去平均值后的离差,计算x元素的平方和及离差平方和。(8)把x从大到小排序。计算x的10%分位数到90%分位数之间的距离。,4.定义一个维数为(3,4,2)的数组其第一层(第三下标为1)取从1开始的奇数,第二层取从2开始的偶数。显示每一层的第2行元素。把第(1,1,1),(2,2,2),(2,2,1)号元素赋值为零。把第一层加上100,把第二层加上200。分别计算第一层和第二层的平均值。5.试画出任一给定的二元正态分布的密度函数图形。如二元标准正态分布等,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号