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

参数nrowncol分别设置矩阵的行和列,我们创建了一个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函数的是时候要注意向量等长的问题。这和前面的任何函数都是一样的,如果向量不等长就会循环填入,循环完整时不会有警告,循环不完整就会出现警告。

我们可以对矩阵命名。这里需要使用函数rownamescolnames:

> 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语言


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册