R matrix 矩阵(补充)
R matrix 矩阵 前一篇
补充:
利用矩阵matrix可以描述二维数据,与向量相似,其内部元素可以是实数、复数、字符、逻辑型数据。矩阵matrix使用两个下标来访问元素,A[i,j]表示矩阵A第i行、第j列的元素。
多维数组array可以描述多维数据。array有一个特征属性叫维数向量(dim属性),它的长度是多维数组的维数,dim内的元素则是对应维度的长度。矩阵是数组的特殊情况,它具有两个维度。
在R中,可以使用matrix函数并以向量形式输入矩阵中的全部元素,使用ncol和nrow可设置矩阵的行数和列数,从而创建一个矩阵。
> (w<-seq(1:10))
[1] 1 2 3 4 5 6 7 8 9 10
> (a<-matrix(w,nrow=5,ncol=2))
[,1] [,2]
[1,] 1 6
[2,] 2 7
[3,] 3 8
[4,] 4 9
[5,] 5 10
先创建一个1~10数列的向量w,然后利用matrix函数将矩阵的行数设置为5,列数设置为2,得到矩阵a。注意,矩阵a的数据是按照列填充的,而在实际工作中,数据可能更多地是按照行填充,这时只需要将参数byrow设置为TRUE即可。
> (a<-matrix(w,nrow=5,ncol=2,byrow=T)) #按行填充
[,1] [,2]
[1,] 1 2
[2,] 3 4
[3,] 5 6
[4,] 7 8
[5,] 9 10
给矩阵的行列命名有助于提高数据的可读性,可通过参数dimnames实现。
# 给行列设置名称
> (a<-matrix(w,nrow=5,ncol=2,byrow=T, dimnames=list(paste0("r",1:5),paste0("l",1:2))))
l1 l2
r1 1 2
r2 3 4
r3 5 6
r4 7 8
r5 9 10
函数cbind()把其自变量横向拼成一个大矩阵,可以想象为水平地将矩阵拼在一起,rbind()把其自变量纵向拼成一个大矩阵,可以将其想象为垂直地将矩阵拼在一起。
当函数cbind()的自变量是矩阵或看作列向量的向量时,自变量的行数应该相等。当rbind()的自变量是矩阵或看作行向量的向量时,自变量的列数应该相等。如果参与合并的自变量比其变量短,则循环不足后合并。例如:
> (x1<-rbind(c(1,2),c(3,4))) # 创建向量x1
[,1] [,2]
[1,] 1 2
[2,] 3 4
> (x2<-10+x1) # 创建向量x2
[,1] [,2]
[1,] 11 12
[2,] 13 14
> (x3<-cbind(x1,x2)) # 将向量x1和x2水平(列)合并
[,1] [,2] [,3] [,4]
[1,] 1 2 11 12
[2,] 3 4 13 14
> (x4<-rbind(x1,x2)) # 将向量x1和x2垂直(行)合并
[,1] [,2]
[1,] 1 2
[2,] 3 4
[3,] 11 12
[4,] 13 14
> cbind(1,x1) # 当1长度小于x1时,会先自动补全为c(1,1),再与x1进行列合并
[,1] [,2] [,3]
[1,] 1 1 2
[2,] 1 3 4
通过函数as.vector(A)可以将矩阵转化为向量。例如:
> (A<-matrix(1:6,nrow=2))
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
> as.vector(A)
[1] 1 2 3 4 5 6
可以使用colSums(列求和)、colMeans(列求平均)、rowSums(行求和)、rowMeans(行求平均)函数对矩阵的行、列求和或者求平均值,也可使用apply函数实现。
> (A <- matrix(1:16,4,4))
[,1] [,2] [,3] [,4]
[1,] 1 5 9 13
[2,] 2 6 10 14
[3,] 3 7 11 15
[4,] 4 8 12 16
> colSums(A) # 等价于 apply(A,2,sum)
[1] 10 26 42 58
> colMeans(A) # 等价于 apply(A,2,mean)
[1] 2.5 6.5 10.5 14.5
> rowSums(A) # 等价于 apply(A,1,sum)
[1] 28 32 36 40
> rowMeans(A) # 等价于 apply(A,1,mean)
[1] 7 8 9 10
矩阵A第一列的元素是1、2、3、4,故第一列的和是1+2+3+4=10,第一列的平均值是(1+2+3+4)/4=2.5。
数组是矩阵的扩展,它把数据的维度扩展到两个以上。这意味着数组中的元素需要两个以上的索引。除此之外,数组与矩阵类似,可以使用相同的方法。与函数matrix()类似,可以通过函数array()方便地创建数组。
> (w<-array(1:30,dim=c(3,5,2)))
, , 1
[,1] [,2] [,3] [,4] [,5]
[1,] 1 4 7 10 13
[2,] 2 5 8 11 14
[3,] 3 6 9 12 15
, , 2
[,1] [,2] [,3] [,4] [,5]
[1,] 16 19 22 25 28
[2,] 17 20 23 26 29
[3,] 18 21 24 27 30
上面表示建立一个三维数据的数组,其维度是3×5×2。在结果中会依次展示2个3行5列的矩阵。