数组与矩阵类似,可以说矩阵是特殊的二维数组。数组是多维的同一类型集合

1.创建数组

与创建矩阵类似,数组可以通过array函数创建

1.1 array函数

函数功能:

Creates or tests for arrays.

创建或测试数组

函数语法:

array(data = NA, dim = length(data), dimnames = NULL)

函数参数:

data	
a vector (including a list or expression vector) giving data to fill the array. 
Non-atomic classed objects are coerced by as.vector.

数组的元素

dim	
the dim attribute for the array to be created, 
that is an integer vector of length one or more 
giving the maximal indices in each dimension.

数组的维度:以数值型向量表示的各个维度下标的最大值

The "dim" attribute is an integer vector of length one or more containing non-negative values: 
the product of the values must match the length of the array.

dim:参数是长度为1及以上的非负整数数组成的整数型向量,向量中数据的乘积等于数组的长度

dimnames	
either NULL or the names for the dimensions. 
This must a list (or it will be ignored) with one component for each dimension, 
either NULL or a character vector of the length given by dim for that dimension. 
The list can be named, and the list names will be used as names for the dimensions. 
If the list is shorter than the number of dimensions, it is extended by NULLs to the length required.
The "dimnames" attribute is optional

各维度名称:可选参数,每个维度的字符向量长度取决于dim定义的各维度长度。命名的列表名称将用作各维度数据名称。若列表的长度小于相应的维度长度,将以NULL填充。

A two-dimensional array is the same thing as a matrix.

二维数据就是矩阵

One-dimensional arrays often look like vectors, 
but may be handled differently by some functions:
*str* does distinguish them in recent versions of R

一维数组跟向量类似,但是在新版的R中一些函数(str)对他们做了区分。

参数

描述

data

数组的元素

dim

数组的维数,以数值型向量表示的各个维度下标的最大值

dimnames

可选参数,各维度名称标签的列表

> #创建数组
> #定义数组各维度的名称
> dim1 <- c('A1','A2')
> dim2 <- c('B1','B2','B3')
> dim3 <- c('C1','C2','C3','C4')
> #创建数组,数组维数为3,各维度下标的最大值为2,3,4
> a <- array(seq(1,24),dim=c(2,3,4),dimnames=list(dim1,dim2,dim3))
> a
, , C1

   B1 B2 B3
A1  1  3  5
A2  2  4  6

, , C2

   B1 B2 B3
A1  7  9 11
A2  8 10 12

, , C3

   B1 B2 B3
A1 13 15 17
A2 14 16 18

, , C4

   B1 B2 B3
A1 19 21 23
A2 20 22 24

2. 数组索引

从数组中选取元素的方式与矩阵相同,不同的是数组的维度更高,下标更复杂。

2.1 单个元素索引

> # 创建数组
> # 定义数组各维度的名称
> dim1 <- c('小王','小李','小孙')
> dim2 <- c('英语','数学','语文','化学')
> dim3 <- c('期中','期末')
> a <- array(seq(50,by=5,length.out=24),dim=c(3,4,2),
+            dimnames=list(dim1,dim2,dim3))
> a
, , 期中

     英语 数学 语文 化学
小王   50   65   80   95
小李   55   70   85  100
小孙   60   75   90  105

, , 期末

     英语 数学 语文 化学
小王  110  125  140  155
小李  115  130  145  160
小孙  120  135  150  165

> # 单个元素索引--下标位置索引
> a[2,3,2]
[1] 145
> # 单个位置索引--名称索引
> a['小李','语文','期末']
[1] 145

2.2 单行/列/层元素索引

> # 单行元素索引--下标位置索引
> a[3,,]
     期中 期末
英语   60  120
数学   75  135
语文   90  150
化学  105  165
> # 单行元素索引--名称索引
> a['小孙',,]
     期中 期末
英语   60  120
数学   75  135
语文   90  150
化学  105  165
> # 单列元素索引--下标位置索引
> a[,4,]
     期中 期末
小王   95  155
小李  100  160
小孙  105  165
> # 单列元素索引--名称索引
> a[,'化学',]
     期中 期末
小王   95  155
小李  100  160
小孙  105  165
> # 单个某层元素索引--下标位置索引
> a[,,2]
     英语 数学 语文 化学
小王  110  125  140  155
小李  115  130  145  160
小孙  120  135  150  165
> # 单个某层元素索引--名称索引
> a[,,'期末']
     英语 数学 语文 化学
小王  110  125  140  155
小李  115  130  145  160
小孙  120  135  150  165

2.3 多维度索引–使用向量

> # 多维度索引--下标位置索引
> a[c(1,2),,2]
     英语 数学 语文 化学
小王  110  125  140  155
小李  115  130  145  160
> a[c(1,3),c(2,4),]
, , 期中

     数学 化学
小王   65   95
小孙   75  105

, , 期末

     数学 化学
小王  125  155
小孙  135  165

> # 多维度索引--名称索引
> a[c('小王','小李'),,'期末']
     英语 数学 语文 化学
小王  110  125  140  155
小李  115  130  145  160
> a[c('小王','小孙'),c('数学','化学'),]
, , 期中

     数学 化学
小王   65   95
小孙   75  105

, , 期末

     数学 化学
小王  125  155
小孙  135  165

3. 数组编辑

3.1 单个元素修改

> # 创建数组
> # 定义数组各维度的名称
> dim1 <- c('小王','小李','小孙')
> dim2 <- c('英语','数学','语文','化学')
> dim3 <- c('期中','期末')
> a <- array(seq(50,by=5,length.out=24),dim=c(3,4,2),
+            dimnames=list(dim1,dim2,dim3))
> a
, , 期中

     英语 数学 语文 化学
小王   50   65   80   95
小李   55   70   85  100
小孙   60   75   90  105

, , 期末

     英语 数学 语文 化学
小王  110  125  140  155
小李  115  130  145  160
小孙  120  135  150  165

> # 修改单个数组元素--下表位置
> a[2,3,2] <- 33
> a
, , 期中

     英语 数学 语文 化学
小王   50   65   80   95
小李   55   70   85  100
小孙   60   75   90  105

, , 期末

     英语 数学 语文 化学
小王  110  125  140  155
小李  115  130   33  160
小孙  120  135  150  165

> # 修改单个数组元素--名称
> a['小李','语文','期末'] <- 333
> a
, , 期中

     英语 数学 语文 化学
小王   50   65   80   95
小李   55   70   85  100
小孙   60   75   90  105

, , 期末

     英语 数学 语文 化学
小王  110  125  140  155
小李  115  130  333  160
小孙  120  135  150  165

3.2 单行/列/层元素修改

> # 修改单行数组元素--下标位置
> a[1,,] <- 88
> a
, , 期中

     英语 数学 语文 化学
小王   88   88   88   88
小李   55   70   85  100
小孙   60   75   90  105

, , 期末

     英语 数学 语文 化学
小王   88   88   88   88
小李  115  130  145  160
小孙  120  135  150  165

> # 修改单行数组元素--名称
> #数据长度需要是被替换数据长度的倍数,否则会报错
> # (被替换元素有2*4=8个,给出3个元素的向量会报错)
> a['小王',,] <- c(99,100)  
> a
, , 期中

     英语 数学 语文 化学
小王   99  100   99  100
小李   55   70   85  100
小孙   60   75   90  105

, , 期末

     英语 数学 语文 化学
小王   99  100   99  100
小李  115  130  145  160
小孙  120  135  150  165

> # 修改单列数组元素--下标位置
> a[,2,] <- 66
> a
, , 期中

     英语 数学 语文 化学
小王   99   66   99  100
小李   55   66   85  100
小孙   60   66   90  105

, , 期末

     英语 数学 语文 化学
小王   99   66   99  100
小李  115   66  145  160
小孙  120   66  150  165

> # 修改单列数组元素--名称
> a[,'数学',] <- c(66,100)  #数据长度需要是被替换数据的倍数,否则会报错
> a
, , 期中

     英语 数学 语文 化学
小王   99   66   99  100
小李   55  100   85  100
小孙   60   66   90  105

, , 期末

     英语 数学 语文 化学
小王   99  100   99  100
小李  115   66  145  160
小孙  120  100  150  165

> # 修改单层数组元素--下标位置
> a[,,1] <- 99
> a
, , 期中

     英语 数学 语文 化学
小王   99   99   99   99
小李   99   99   99   99
小孙   99   99   99   99

, , 期末

     英语 数学 语文 化学
小王   99  100   99  100
小李  115   66  145  160
小孙  120  100  150  165

> # 修改单层数组元素--名称
> #数据长度需要是被替换数据的倍数,否则会报错,数据纵向填充
> a[,,'期中'] <- c(999,1000,888,900) 
> a
, , 期中

     英语 数学 语文 化学
小王  999  900  888 1000
小李 1000  999  900  888
小孙  888 1000  999  900

, , 期末

     英语 数学 语文 化学
小王   99  100   99  100
小李  115   66  145  160
小孙  120  100  150  165

3.3 多维度元素修改

> # 修改多维度数组元素--下标位置
> a[c(1,2),c(2,4),] <- 11
> a
, , 期中

     英语 数学 语文 化学
小王  999   11  888   11
小李 1000   11  900   11
小孙  888 1000  999  900

, , 期末

     英语 数学 语文 化学
小王   99   11   99   11
小李  115   11  145   11
小孙  120  100  150  165

> a[c(1,2),c(2,4),] <- c(111,222)
> a
, , 期中

     英语 数学 语文 化学
小王  999  111  888  111
小李 1000  222  900  222
小孙  888 1000  999  900

, , 期末

     英语 数学 语文 化学
小王   99  111   99  111
小李  115  222  145  222
小孙  120  100  150  165

> # 修改多维度数组元素--名称
> a[c('小王','小李'),c('数学','化学'),] <- 111
> a
, , 期中

     英语 数学 语文 化学
小王  999  111  888  111
小李 1000  111  900  111
小孙  888 1000  999  900

, , 期末

     英语 数学 语文 化学
小王   99  111   99  111
小李  115  111  145  111
小孙  120  100  150  165

> a[c('小王','小李'),c('数学','化学'),] <- c(111,222)
> a
, , 期中

     英语 数学 语文 化学
小王  999  111  888  111
小李 1000  222  900  222
小孙  888 1000  999  900

, , 期末

     英语 数学 语文 化学
小王   99  111   99  111
小李  115  222  145  222
小孙  120  100  150  165

4.数组的常用运算

> # 数组的常用运算
> a <- array(seq(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

> b <- array(rep(2,12),dim=c(2,3,2))
> b
, , 1

     [,1] [,2] [,3]
[1,]    2    2    2
[2,]    2    2    2

, , 2

     [,1] [,2] [,3]
[1,]    2    2    2
[2,]    2    2    2

> # a+b :对应位置求和
> a+b
, , 1

     [,1] [,2] [,3]
[1,]    3    5    7
[2,]    4    6    8

, , 2

     [,1] [,2] [,3]
[1,]    9   11   13
[2,]   10   12   14

> # a-b :对应位置元素相减
> a-b
, , 1

     [,1] [,2] [,3]
[1,]   -1    1    3
[2,]    0    2    4

, , 2

     [,1] [,2] [,3]
[1,]    5    7    9
[2,]    6    8   10

> # a/b :对应位置元素相除
> a/b
, , 1

     [,1] [,2] [,3]
[1,]  0.5  1.5  2.5
[2,]  1.0  2.0  3.0

, , 2

     [,1] [,2] [,3]
[1,]  3.5  4.5  5.5
[2,]  4.0  5.0  6.0

> # a*b :对应位置元素相乘
> a*b
, , 1

     [,1] [,2] [,3]
[1,]    2    6   10
[2,]    4    8   12

, , 2

     [,1] [,2] [,3]
[1,]   14   18   22
[2,]   16   20   24