矩阵
1 .定义
具有行数和列数的一个规则的二维表。
2. 矩阵的创建
2.1 matrix()函数
在R语言中使用,matrix()函数创建矩阵。matrix()的原型为:matrix(data=NA,nrow=1,ncol=1,byrow=FALSE,dimnames=NULL)。
data:包含了矩阵的元素,一般是个向量,默认情况下是NA。
nrow和ncol:设定矩阵的行、列数目;一般这两个值只需设定 一个,另一个值可以根据元素的数目自动给出。
byrow:设定矩阵是按行(byrow=TRUE)填充还是按列(byrow=FALSE)填充,默认是按照列进行填充的。
dimnames:包含了以字符型向量表示的行名和列名,是一个列表,默认情况下没有行列名。
2.2 例子
> mat1 <- matrix(1:6, nrow=2) ##默认按列填充
> mat1
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
> mat2 <- matrix(1:6, nrow=2, byrow=TRUE) ##设定byrow=TRUE按行填充
> mat2
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
> rnames <- c('R1', 'R2') ##行名
> cnames <- c('C1', 'C2', 'C3') ##列名
> mat3 <- matrix(1:6, nrow=2, dimnames=list(rnames, cnames)) ##通过设定dimnames参数添加行列名
> mat3
C1 C2 C3
R1 1 3 5
R2 2 4 6
也可以通过使用rownames()、colnames()函数来给矩阵添加行、列名
###也可通过使用rownames()、colnames()函数来给矩阵添加行、列名
> rownames(mat) <- c('r1', 'r2') ##添加行名
> colnames(mat) <- c('c1', 'c2', 'c3') ##添加列名
> mat
c1 c2 c3
r1 1 2 3
r2 4 5 6
2.2 dim()函数
也可以通过使用dim()函数来创建矩阵,其原理是通过改变维度是向量变为矩阵。
2.2.1 例子
> mat4 <- 1:6 ##向量
> dim(mat4) <- c(3, 2) ##变为3行2列的矩阵
> is.matrix(mat4) ##判断是否为矩阵
[1] TRUE
> mat4 ##默认按列填充
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
2.3 矩阵的转置
将矩阵的行列数进行对换。
2.3.1 t()函数
2.3.1.1 例子
> mat4 <- 1:6
> dim(mat4) <- c(2, 3) ##与上面不一样
> mat4 <- t(mat4) ##矩阵转置
> mat4 ##按行填充
[,1] [,2]
[1,] 1 2
[2,] 3 4
[3,] 5 6
3. 矩阵的属性
矩阵的属性包括元素的的数据类型(integer)、矩阵的维度、元素的个数等。
> mat <- matrix(1:6, nrow=2, dimnames=list(rnames, cnames))
> mat
C1 C2 C3
R1 1 3 5
R2 2 4 6
> class(mat) ##结构类型
[1] "matrix"
> typeof(mat) ##元素数据类型
[1] "integer"
> dim(mat) ##维度,2行3列
[1] 2 3
> length(mat) ##元素个数
[1] 6
> rownames(mat) ##获取行名
[1] "R1" "R2"
> colnames(mat) ##获取列名
[1] "C1" "C2" "C3"
3.1 访问矩阵中的元素
先生成一个矩阵
>mat<-matrix(1:9,nrow=3,ncol=3,dimname=list(c('r1','r2','r3'),c('c1','c2','c3'))
>mat
> c1 c2 c3
r1 1 4 7
r2 2 5 8
r3 3 6 9
3.2 访问某行元素
>mat[2,] #访问第二行元素
>c1 c2 c3
2 5 8
>mat['r2',] #通过行名称,访问第二行元素
>c1 c2 c3
2 5 8
3.3 访问某列元素
>mat[,2] #访问第二列元素
>r1 r2 r3
4 5 6
>mat[,'c2'] #通过列名称,访问第二列的元素
>r1 r2 r3
4 5 6
3.4 访问某一个元素
>mat[2,2] mat #访问第2行第2列元素
[1] 5
> mat['r2', 'c2'] #通过行、列名称,访问第二行第二列的元素
[1] 5
当使用行或列的名称,访问元素时,注意符号‘’。
值得注意的是,当用上面的方式获取某个或某行或某列元素时,返回的是一个向量。
3.4.1使返回的对象转变为矩阵
> mat[2, 2, drop=FALSE]
c2
r2 5
> mat[2, , drop=FALSE]
c1 c2 c3
r2 2 5 8
> is.matrix(mat[2, 2, drop=FALSE]) ##返回的是个矩阵
[1] TRUE
> is.matrix(mat[2, , drop=FALSE]) ##返回的是个矩阵
[1] TRUE
通过将参数drop设定为FALSE,返回的将会是个矩阵
3.5 访问部分元素
> mat[c(2, 3), c(2, 3)] ##访问第2、3行第2、3列元素,返回为矩阵
c2 c3
r2 5 8
r3 6 9
> mat[c('r2','r3'), c('c2','c3')]
c2 c3
r2 5 8
r3 6 9
访问部分元素时,返回的对象是矩阵。
4. 修改矩阵中的元素
先生成一个矩阵
>mat<-matrix(1:9,nrow=3,ncol=3,dimname=list(c('r1','r2','r3'),c('c1','c2','c3'))
>mat
> c1 c2 c3
r1 1 4 7
r2 2 5 8
r3 3 6 9
4.1 修改某一个元素
> mat[2, 2] <- 20 ##将第2行第2列元素改为20
> mat
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 20 8
[3,] 3 6 9
4.2 修改某一行/列的元素
> mat[ ,3] <- 10 ##将第3列元素都改为10
> mat
[,1] [,2] [,3]
[1,] 1 4 10
[2,] 2 20 10
[3,] 3 6 10
4.3 删除元素
> mat <- mat[-2, ] ##删掉第二行
> mat
[,1] [,2] [,3]
[1,] 7 7 10
[2,] 7 6 10
4.4 通过逻辑条件修改元素
> mat[mat<6] <- 7 ##将小于6的元素都改为7
> mat
[,1] [,2] [,3]
[1,] 7 7 10
[2,] 7 20 10
[3,] 7 6 10
4.5 通过rbind()和cbind()函数可添加行和列
> mat <- matrix(1:9, nrow=3)
> mat
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> rbind(mat, c(12, 13, 14)) ##在原矩阵mat后面添加一行
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
[4,] 12 13 14
> cbind(mat, c(12, 13, 14)) ##在原矩阵mat后面添加一列
[,1] [,2] [,3] [,4]
[1,] 1 4 7 12
[2,] 2 5 8 13
[3,] 3 6 9 14