R语言系统教程(三):多维数组和矩阵
3.1 生成数组或矩阵
数组可以看成是带多个下标的类型相同的元素的集合,但是注意,尽管数学上向量可以看成一维数组,但是R中不行,因为数组一定是有维度属性的,但向量没有。
3.1.1 将向量定义为数组
向量只有定义了维数(dim)属性后才能看做数组。
z = 1:12
dim(z)
## NULL
dim(z) = c(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
3.1.2 用array()函数构造多维数组
array()函数声明如下:
array(data = NA, dim = length(data), dimnames = NULL)
其中data为向量数据,dim是维度向量,默认为原向量的长度,dimnames为各维度的名字。注意如果data数据个数不足或多于构造多维数组所需的数量,则采用循环或只取较前部分的方式。因此使用单0或单1数据构造全0或全1矩阵的方法非常常见。
X = array(1:20, dim = c(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, 2))
Z
## , , 1
##
## [,1] [,2] [,3] [,4]
## [1,] 0 0 0 0
## [2,] 0 0 0 0
## [3,] 0 0 0 0
##
## , , 2
##
## [,1] [,2] [,3] [,4]
## [1,] 0 0 0 0
## [2,] 0 0 0 0
## [3,] 0 0 0 0
上面这种全0的定义方式常用来对数组进行初始化。
3.1.3 用matrix()函数构造矩阵
矩阵即是二维数组,是R中用的最多的数据格式之一,函数matrix()是构造矩阵的函数,其构造形式如下:
matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)
其中data是向量数据,nrow是矩阵行数,ncol是矩阵列数,当byrow=TRUE时,数据按行存放,否则按列存放,dimnames为维数名字。
注意:若仅指定nrow或ncol时,如果data数据个数不够,则另一个取1,循环补齐,若为nrow或ncol的倍数时,则未指定的自动取其另一个因数,比其大却不是倍数,warning!(没看懂没关系,看例子你就懂了(╹▽╹))
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
matrix(1:15, nrow=3,byrow=TRUE)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 2 3 4 5
## [2,] 6 7 8 9 10
## [3,] 11 12 13 14 15
matrix(1:15, ncol=5,byrow=TRUE)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 2 3 4 5
## [2,] 6 7 8 9 10
## [3,] 11 12 13 14 15
3.2 数组下标
与向量相同,数组同样可以按照下标访问或修改元素。
3.2.1 数组下标
使用方括号形式,并用逗号分隔开不同维度的下标即可
a = 1:24
dim(a) = c(2,3,4)
a[2,1,2]
## [1] 8
下标同样为向量形式,如果不写则表示此维全取
a[1, 2:3, 2:3]
## [,1] [,2]
## [1,] 9 15
## [2,] 11 17
a[1, , ]
## [,1] [,2] [,3] [,4]
## [1,] 1 7 13 19
## [2,] 3 9 15 21
## [3,] 5 11 17 23
a[, 2, ]
## [,1] [,2] [,3] [,4]
## [1,] 3 9 15 21
## [2,] 4 10 16 22
a[1, 1, ]
## [1] 1 7 13 19
还有一种是通过向量下标方式取值,但要注意这样取出来的是向量,而不是数组。
注:由于格式问题,从这里开始作者更换了代码输出样式,>后代表的是代码,其他的是输出。
> b = a[3:6]
> b
[1] 3 4 5 6
3.2.2 不规则的数组下标
如果想把数组中的任意位置元素作为数组访问,其方法是使用一个二维数组作为数组下标,二维数组的每一行是一个元素的下标,列数为数组维数。
> b = matrix(c(1,1,1,2,2,3,1,3