矩阵(matrix)是一种特殊的向量,包含两个附加的属性:行数和列数。所以矩阵和向量一样,有模式的概念。iru数值型和字符型。(但反过来,向量不能看作是只有一列或只有一行的矩阵)
数组(array)是R里更一般的对象,矩阵是数组的一个特殊情形。数组可以是多维的。例如一个三维数组可以包含行、列和层(layer),而一个矩阵只有行和列两个维度。
R的强大之处在于它丰富的矩阵运算。
矩阵的行和列的下标都是从1开始。
方法一:使用matrix()函数创建矩阵
> y<-matrix(c(1,2,3,4),nrow=2,ncol=2)
> y
[,1] [,2]
[1,] 1 3
[2,] 2 4
> k<-matrix(c(1:10),nrow=5)
> k
[,1] [,2]
[1,] 1 6
[2,] 2 7
[3,] 3 8
[4,] 4 9
[5,] 5 10
> #另外一种方法是创建矩阵后,为矩阵的每一个元素赋值
> test<-matrix(nrow=2,ncol=3)
> test[1,]=rep(2,3)
> test[2,]=seq(1,3,1)
> test
[,1] [,2] [,3]
[1,] 2 2 2
[2,] 1 2 3
>
> y
[,1] [,2]
[1,] 1 3
[2,] 2 4
> y%*%y
[,1] [,2]
[1,] 7 15
[2,] 10 22
> y%*%y # mathematical matrix multiplication
[,1] [,2]
[1,] 7 15
[2,] 10 22
> 3*y # mathematical multiplication of matrix by scalar
[,1] [,2]
[1,] 3 9
[2,] 6 12
>
> y
[,1]
[1,] NA
[2,] NA
> y=(1:10)
> y
[1] 1 2 3 4 5 6 7 8 9 10
> y<-matrix(nrow=2)
> y
[,1]
[1,] NA
[2,] NA
> y=(1:10)
> m=matrix(y,nrow=2)
> m
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
> m[,2:4]
[,1] [,2] [,3]
[1,] 3 5 7
[2,] 4 6 8
> m[1:4,]
Error in m[1:4, ] : 下标出界
> m[1,]
[1] 1 3 5 7 9
> m[,2:4]=c(22,22,22,22)
Error in m[, 2:4] = c(22, 22, 22, 22) : 被替换的项目不是替换值长度的倍数
> m[,2:4]=c(22,22,22)
> m
[,1] [,2] [,3] [,4] [,5]
[1,] 1 22 22 22 9
[2,] 2 22 22 22 10
> #向量的负值索引来除掉某些元素,这种操作 同样适用于矩阵
> m
[,1] [,2] [,3] [,4] [,5]
[1,] 1 22 22 22 9
[2,] 2 22 22 22 10
> m[-1]
[1] 2 22 22 22 22 22 22 9 10
>
> z
[,1] [,2] [,3]
[1,] 5 8 -3
[2,] 2 5 8
[3,] -3 2 5
> apply(z,2,mean)
[1] 1.333333 5.000000 3.333333
> apply(z,1,mean)
[1] 3.333333 5.000000 1.333333
> z
[,1] [,2] [,3]
[1,] 5 8 -3
[2,] 2 5 8
[3,] -3 2 5
> t(z) #转置
[,1] [,2] [,3]
[1,] 5 2 -3
[2,] 8 5 2
[3,] -3 8 5
> z
[,1] [,2] [,3]
[1,] 5 8 -3
[2,] 2 5 8
[3,] -3 2 5
> x<-z[1,]
> x
[1] 5 8 -3
> x<-c(x,20) #append 20
> x
[1] 5 8 -3 20
> x<-c(x[1:2],520,x[3,4]) #insert 20
Error in x[3, 4] : 量度数目不对
> x<-c(x[1:2],520,x[3:4]) #insert 520
> x
[1] 5 8 520 -3 20
> x<-x[-(length(x)-1),-length(x)]#delete -3 and 20
Error in x[-(length(x) - 1), -length(x)] : 量度数目不对
> x<-x[-(length(x)-1):-length(x)]#delete -3 and 20
> x
[1] 5 8 520
>
> one=rep(1,4)
> one
[1] 1 1 1 1
> z=rbind(c(1,2,3,4),c(1,1,0,0),c(1,0,1,0))
> z
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 1 1 0 0
[3,] 1 0 1 0
> z<-t(z)
> z
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 2 1 0
[3,] 3 0 1
[4,] 4 0 0
> cbind(one,z)
one
[1,] 1 1 1 1
[2,] 1 2 1 0
[3,] 1 3 0 1
[4,] 1 4 0 0
> rbind(one,z)
[,1] [,2] [,3]
one 1 1 1
1 1 1
2 1 0
3 0 1
4 0 0
Warning message:
In rbind(one, z) :
number of columns of result is not a multiple of vector length (arg 1)
>
5. 向量与矩阵的差异
z=matrix(1:8,nrow=4)
> z
[,1] [,2]
[1,] 1 5
[2,] 2 6
[3,] 3 7
[4,] 4 8
> length(z)
[1] 8
> class(z)
[1] "matrix"
> atrributes(z)
错误: 没有"atrributes"这个函数
> atrribute(z)
错误: 没有"atrribute"这个函数
> attributes(z)
$dim
[1] 4 2
> dim(z)
[1] 4 2
> nrow(z)
[1] 4
> ncol(z)
[1] 2
>
6. 避免意外降维
> z
[,1] [,2]
[1,] 1 5
[2,] 2 6
[3,] 3 7
[4,] 4 8
> r<-z[2,]
> r
[1] 2 6
> attributes(r)
NULL
> $dim
错误: 意外的'$' in "$"
> str(z)
int [1:4, 1:2] 1 2 3 4 5 6 7 8
> str(r)
int [1:2] 2 6
> #R禁止自动减少维度
> r<-z[2,drop=F]
> dim(r)
NULL
> r<-z[2,,drop=F]
> r
[,1] [,2]
[1,] 2 6
> dim(r)
[1] 1 2
> #原本是向量的,可以使用as.matrix函数将其转化为矩阵
> r<-z[2,]
> dim(r)
NULL
> r<-as.matrix(r)
> dim(r)
[1] 2 1
>
> z
[,1] [,2]
[1,] 1 5
[2,] 2 6
[3,] 3 7
[4,] 4 8
> colnames(z)
NULL
> colnames(z)<-c("a,"b")
错误: unexpected symbol in "colnames(z)<-c("a,"b"
> colnames(z)<-c("a","b")
> z
a b
[1,] 1 5
[2,] 2 6
[3,] 3 7
[4,] 4 8
>