R(05):第二章:2.5多维数组和矩阵(1)

《统计建模与R软件》薛毅

第2章 R软件的使用

2.5 多维数组和矩阵

总结:dim(), array(), matrix(), a[,]取值。
总结:数组的生成,通过dim(z)函数,使向量z变成一个数组,同时需要指定数组的排列形式,dim(z)<-c(3,4);数组先按照列存放,再按照行存放;利用array(1:20, dim=c(4,5))生成数组,1:20是数组的值,dim=c(4,5)是数值排列方式,4行5列;构造矩阵matrix(1:15, nrow=3, ncol=5, byrow=TRUE),1:15矩阵数值,行数(nrow),列数(ncol),byrow排列方式;用逗号分隔取数组下标a[2, 1, 2],取两行三列四维的数值;也可通过向量构造数值下标并取值,二维数组的每一行为一个下标,取三维数组的值。

2.5.1 生成数组或矩阵

数组(array)可以看成是带多个下标的类型相同的元素的集合,常用的是数值型的数组如矩阵,最常见的是二维数组。
数组有一个特征属性叫做维数向量(dim属性),维数向量是一个元素取正整数值的向量,其长度是数组的维数,比如维数向量有两个元素时数组为二维数组(矩阵)。维数向量的每一个元素指定来该下标的上界,下标的下界总为1。

1. 将向量定义成数组

向量只有定义了维数向量(dim属性)后才能被看作是数组,比如:
> z <- 1:12
> dim(z)<-c(3,4)#将向量z定义dim属性,这里c(3,4)表示定义一个3行4列的数组
> z
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
注意重点内容:矩阵的元素是按照列存放的,即**先存列,再存行**
定义一个一维数组,例如:
> dim(z)<-12
> z
[1] 1 2 3 4 5 6 7 8 9 10 11 12

2. 用array()函数构造多维数组

array()函数直接构造数组的方法是:
array(data=NA, dim=length(data), dimnames=NULL)
其中data是一个向量数据;dim是数组各维度的长度,默认值为原向量的长度;dimnames是数组维的名字,默认值为空,例如:
> X <- array(1:20, dim=c(4,5))#生成一个4行5列的数组
> X
[,1] [,2] [,3] [,4] [,5]
[1,] 1 5 9 13 17
[2,] 2 6 10 14 18
[3,] 3 7 11 15 19
[4,] 4 8 12 16 20
构造特殊的数组
> Z <- array(0, dim=c(3,4)); Z
[,1] [,2] [,3] [,4]
[1,] 0 0 0 0
[2,] 0 0 0 0
[3,] 0 0 0 0
定义了一个3行4列的二维数组,其元素均为0

3. 用matrix()函数构造矩阵

函数matrix()主要用于构造二维数组,其函数形式为:
matrix(data=NA, nrow=1, ncol=1, byrow=FALSE, dimnames=NULL)
其中data是一个向量数据;nrow是矩阵的行数;ncol是矩阵的列数;当byrow=TRUE时,生成矩阵的数据按行放置,默认值byrow=FALSE,数据按列放置;dinames时数组维的名字,默认值为空。
例如构造一个3X5阶的矩阵
> A <- matrix(1:15, nrow=3, ncol=5, byrow=TRUE); A
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 6 7 8 9 10
[3,] 11 12 13 14 15
下面的两种格式与上面的结果等价:
> A <- matrix(1:15, nrow=3, byrow=TRUE)
> A <- matrix(1:15, ncol=5, byrow=TRUE)
当设定好了行或列的值,另外的列和行会自行分配

2.5.2 数组下标

数组与向量一样,可以对数组中的某些元素进行访问或进行运算;

1. 数组下标

要访问数组的某个元素,只要写出数组名和方括号内的用逗号分开的下标即可,例如生成一个两行三列四维度数组:
> a <- 1:24
> dim(a) <- c(2,3,4)
> a[2, 1, 2]
[1] 8
> a
> a[2,,]#表示取第一个维度为2的,其他维度写“,”表示取这个维度的所有值
[,1] [,2] [,3] [,4]
[1,] 2 8 14 20
[2,] 4 10 16 22
[3,] 6 12 18 24
> a[2,2,]#表示再取第二个维度为2的
[1] 4 10 16 22
> a[2,2,2]#表示再去第三个维度为2的
[1] 10
当然也可以取一定范围内的数值
> a[2,2:3,1:3]
[,1] [,2] [,3]
[1,] 4 10 16
[2,] 6 12 18
> ma=matrix(1:21,nrow=7,byrow=TRUE)
> ma
····[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
[4,] 10 11 12
[5,] 13 14 15
[6,] 16 17 18
[7,] 19 20 21
> ma[-(2:5),1:2]#负数表示扣除,不显示选定的内容
····[,1] [,2]
[1,] 1 2
[2,] 16 17
[3,] 19 20
a[] <- 0#表示在不改变数组维数条件下把元素都赋值成为0

2. 不规则的数组下标

也可以把数组中任意位置的元素作为数组访问,其方法是用一个二维数组作为数组的下标,二维数组的每一行是一个元素的下标,列数为数组的维数。
例如,要把上面的形状为2X3X4的数组a的第[1,1,1], [2,2,3], [1,3,4], [2,1,4]号共四个元素作为一个整体访问,先定义一个包含这些下标作为行的二维数组:
> b <- matrix(c(1,1,1,2,2,3,1,3,4,2,1,4), ncol=3, byrow=T)
> b
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 2 2 3
[3,] 1 3 4
[4,] 2 1 4
> a[b]b这个二维数组的每一行为一个下标
[1] 1 16 23 20
取出的结果是一个向量,也可以对这几个元素进行赋值,例如:
> a[b] <- c(101,102,103,104)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值