R语言入门第五讲:使用matrix创建矩阵
主要函数:matrix()、is.matrix()、as,matrix()、dim()、t()...
今天第五篇~~~~
前面我给大家介绍了c()函数和cbind函数,实际上,c()函数结合的向量是一维的,cbind函数结合的向量是二维的。今天再给大家介绍一个函数:matrix。使用这个函数将形成一个矩阵。
先来看一看矩阵的格式:
> M=matrix(nrow=3,ncol=4)
> M
[,1] [,2] [,3] [,4]
[1,] NA NA NA NA
[2,] NA NA NA NA
[3,] NA NA NA NA
参数nrow和ncol分别设置矩阵的行和列,我们创建了一个3行4列的矩阵。如果大家还记得方括号的作用,那么向矩阵中按列填写1~12就应该是这样的:
> M[,1]=c(1:3)
> M[,2]=c(4:6)
> M[,3]=c(7:9)
> M[,4]=c(10:12)
> M
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
按行填写只需要将方括号中的逗号位置改变,或者参照矩阵中方括号及数字的写法即可。如果是像这样按照一定规律把元素填入矩阵中,还有一个简便的方法:
> M1=matrix(1:12,nrow=3)
> M1
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
这样是按照列将1~12填入矩阵,如果想按照行,只需要加入byrow=T这个参数:
> M2=matrix(1:12,nrow=3,byrow=T)
> M2
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 5 6 7 8
[3,] 9 10 11 12
第一种方法虽然步骤比较多,但是并不一定是麻烦的,例如我们填入的数字是“1,56,8,41,32,96,78,412,55,33,18,9”,并不规律,那么可能第一种方法就比较适用了。当然你也可以用c()函数将无规律的数字有规律的结合,总之方法不是唯一的:
> M3=matrix(c(1,7,9,23,89,75,123,456,789,10,65,997),nrow=3)
> M3
[,1] [,2] [,3] [,4]
[1,] 1 23 123 10
[2,] 7 89 456 65
[3,] 9 75 789 997
想要提取矩阵中的某个元素,只需要用方括号即可:
> M3[1,3]
[1] 123
这行代码表示我们提取的是M3矩阵中的第一行第三列的元素。
很容易想到,如果要提取第一列或者第一行的元素,代码一定是M3[,1]和M3[1,],我就不举例子了。
实际上方括号的作用在c()或者cbind中的作用是一样的:
> M4=c(1,3,5,7,9,11,13,15)
> M4[5]
[1] 9
第一行将数字用c()结合起来,第二行提取了M4的第五个元素。因为该向量是一维的,不存在行和列,因此直接填数字就可以了。
> M5=cbind(c(1,3,5,7,9),c(2,4,6,8,10))
> M5[2,2]
[1] 4
代码的第一行将数字用cbind结合成一个列表,第二行表示提取M5中的第二行第二列的元素。
为了验证我们上述向量中哪一个是矩阵,我们需要一个函数is.matrix:
> is.matrix(M)
[1] TRUE
> is.matrix(M4)
[1] FALSE
> is.matrix(M5)
[1] TRUE
如果是矩阵,那么就会给出TRUE这个值,如果不是,就给出FALSE。这里列表也给出的是TRUE。
还有一个函数是as.matrix,也是很方便的函数,当我们已经有包含元素的向量时,它使我们不必为矩阵中的元素再赋值。例如:
> A=c(1,3,5)
> B=c(2,4,6)
> C=c(8,10,12)
我们构建了3个向量A,B,C,这时我们想把它们按照列构建到向量中。如果直接使用matrix就会得到奇怪的结果:
> matrix(cbind(A,B,C))
[,1]
[1,] 1
[2,] 3
[3,] 5
[4,] 2
[5,] 4
[6,] 6
[7,] 8
[8,] 10
[9,] 12
这并不是我们想要的结果。此时需要用as.matrix:
> as.matrix(cbind(A,B,C))
A B C
[1,] 1 2 8
[2,] 3 4 10
[3,] 5 6 12
使用matrix函数的是时候要注意向量等长的问题。这和前面的任何函数都是一样的,如果向量不等长就会循环填入,循环完整时不会有警告,循环不完整就会出现警告。
我们可以对矩阵命名。这里需要使用函数rownames与colnames:
> M6=matrix(1:9,nrow=3)
> rownames(M6)=c("A","B","C")
> colnames(M6)=c("D","E","F")
> M6
D E F
A 1 4 7
B 2 5 8
C 3 6 9
我们也可以使用参数dimnames:
> M7=matrix(1:9,nrow=3,dimnames=list(c("A","B","C"),c("D","E","F")))
> M7
D E F
A 1 4 7
B 2 5 8
C 3 6 9
这里面使用了一个list函数,它也是一种结合向量的函数。现在先不管它,我们要知道,list中第一个c()结合的是行变量名,第二个c()结合的是列变量名。这个只针对于matrix函数,对于as.matrix,可能还需要使用第一种方法。(如果有好的方法可以与我讨论o(∩_∩)o )
函数nrow()和ncol()用来查看矩阵的行与列:
> nrow(M7);ncol(M7)
[1] 3
[1] 3
结果显示M6这个矩阵有三行三列。这里面我用了一个分号“;”让R对两个代码分别执行。执行后第一行的结果是第一个代码的结果,第二行的结果是第二个代码的结果。“;”好处可能就是比较节省界面,比如前面对向量是否为一个矩阵的判别,我们也可以这么写代码:
> is.matrix(M);is.matrix(M4);is.matrix(M5)
[1] TRUE
[1] FALSE
[1] TRUE
使用dim()函数可以直接告诉我们向量的维度:
> dim(M)
[1] 3 4
即3行4列。
该函数也可以“反”着使用,即创建一个拥有多少维度的向量:
> x=1:12
> dim(x)=c(3,4)
> x
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
第一行代码表示我们将1~12赋值给向量x,第二行表示用dim将x向量变成三行四列的形式。
说到“反着使用”,R中的负号给我们提供了一些方便:
> x=c(1,3,4,7,9)
> x[-2]
[1] 1 4 7 9
使用 x[-2]提取了x向量中除第2个元素以外的其他元素。
最后给大家介绍一个函数t()。t的意思是“transpose”,或者叫“matrix transpose”,即对矩阵的转置:
> M7
D E F
A 1 4 7
B 2 5 8
C 3 6 9
> t(M7)
A B C
D 1 2 3
E 4 5 6
F 7 8 9
我们对矩阵M7进行了转置,结果是列变成了行,行变成了列。
今天就讲到这里~~~~
(图片来源于网络)
关注 负基础学R语言
微信扫一扫关注公众号