R语言笔记之数据类型5-数组

数组

什么是数组

数组:一维数据是向量,二维数据是矩阵,数组是向量和矩阵的直接推广,是由三维或三维以上的数据构成的。

构建数组

数组函数是array(),语法是:array(dadta, dim),其中data必须是同一类型的数据,dim是各维的长度组成的向量。函数rowSums, colSums, rowMeans, colMeans分别可以计算行总和,行均值,列总和,列均值,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
a<-array(rep(1:3,each=3),dim=c(3,3))
a
## [,1] [,2] [,3]
## [1,]1 2 3
## [2,]1 2 3
## [3,]1 2 3
rowSums(a)
## [1] 6 6 6
colSums(a)
## [1] 3 6 9
table(a)
## a
## 1 2 3
## 3 3 3

多维数组

1
colSums (x, na.rm = FALSE, dims = 1) rowSums (x, na.rm = FALSE, dims = 1) colMeans(x, na.rm = FALSE, dims = 1) rowMeans(x, na.rm = FALSE, dims = 1)

其中dims为整数,表示哪个或哪些维数被看做行或列,对于row统计函数,dims+1及以后的维度被看做行,对于col函数,dims及以前的维度(1:dims)被看做列:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
b <- array(rep(1:3, each=9), dim=c(3,3,3));b
## , , 1
##
## [,1] [,2] [,3]
## [1,]1 1 1
## [2,]1 1 1
## [3,]1 1 1
##
## , , 2
##
## [,1] [,2] [,3]
## [1,]2 2 2
## [2,]2 2 2
## [3,]2 2 2
##
## , , 3
##
## [,1] [,2] [,3]
## [1,]3 3 3
## [2,]3 3 3
## [3,]3 3 3
rowSums(b)
## [1] 18 18 18
rowSums(b,dims=1)
## [1] 18 18 18
rowSums(b,dims=2)
## [,1] [,2] [,3]
## [1,]6 6 6
## [2,]6 6 6
## [3,]6 6 6
colSums(b)
## [,1] [,2] [,3]
## [1,]3 6 9
## [2,]3 6 9
## [3,]3 6 9
colSums(b,dims=2)
## [1] 9 18 27
table(b)
## b
## 1 2 3
## 9 9 9

数组命名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
x<-1:3 #建立向量x
names(x) #提取向量x的名称
## NULL
names(x)<-c("a","b","c");x#将a,b,c作为x的名称
## a b c
## 1 2 3
names(x)#显示向量x的名称
## [1] "a" "b" "c"
names(x)<-NULL;x #删除向量x的名称
## [1] 1 2 3
x<-matrix(1:4,2)
rownames(x)<-c("a","b") # 将行命名为a,b
colnames(x)<-c("c","d");x # 将列命名为c,d
## c d
## a 1 3
## b 2 4
dimnames(x)#返回包含两个向量的列表
## [[1]]
## [1] "a" "b"
##
## [[2]]
## [1] "c" "d"
a<-array(1:8,dim=c(2,2,2));a#建立数组a,维度为2,2,2
## , , 1
##
## [,1] [,2]
## [1,]1 3
## [2,]2 4
##
## , , 2
##
## [,1] [,2]
## [1,]5 7
## [2,]6 8
dimnames(a)<-list(c("a","b"),c("c","d"),c("e","f"));a # 将数组a的各组命名
## , , e
##
## c d
## a 1 3
## b 2 4
##
## , , f
##
## c d
## a 5 7
## b 6 8

行列求和,平均值和频数

简单数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
a <- array(rep(1:3, each=3), dim=c(3,3));a
## [,1] [,2] [,3]
## [1,]1 2 3
## [2,]1 2 3
## [3,]1 2 3
rowSums(a) # 求行的和
## [1] 6 6 6
colSums(a) # 求列的和 
## [1] 3 6 9
table(a) # 频数表
## a
## 1 2 3
## 3 3 3

多维数组

对于多维数组,rowSums, colSums, rowMeans, colMeans的使用稍为复杂点。它们的参数为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
b <- array(rep(1:3, each=9), dim=c(3,3,3));b
## , , 1
##
## [,1] [,2] [,3]
## [1,]1 1 1
## [2,]1 1 1
## [3,]1 1 1
##
## , , 2
##
## [,1] [,2] [,3]
## [1,]2 2 2
## [2,]2 2 2
## [3,]2 2 2
##
## , , 3
##
## [,1] [,2] [,3]
## [1,]3 3 3
## [2,]3 3 3
## [3,]3 3 3
rowSums(b)
## [1] 18 18 18
rowSums(b,dims=1)
## [1] 18 18 18
rowSums(b,dims=2)
## [,1] [,2] [,3]
## [1,]6 6 6
## [2,]6 6 6
## [3,]6 6 6
colSums(b)
## [,1] [,2] [,3]
## [1,]3 6 9
## [2,]3 6 9
## [3,]3 6 9
colSums(b,dims=2)
## [1] 9 18 27
table(b)
## b
## 1 2 3
## 9 9 9
c <- sample(letters[1:5], 10, replace=TRUE)
table(c)
## c
## a b d e
## 1 3 2 4

其实向量,矩阵和数组的性质和操作方式几乎完全相同。它们的共同特征就是这三种数据结构都属于同质数据类(homogeneous data types),即所侦破的一定是相同类型的元素。但是在R中,也存在着异质数据类(heterogeneous data types),即可以储存不同类型的元素,这能够极大地提高存储的灵活性,但同时也丧失了存储效率和运行效率。

参考资料

  1. R语言编程指南.任坤