数组与矩阵类似,可以说矩阵是特殊的二维数组。数组是多维的同一类型集合
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