微信号:gh_d249a545f417

介绍:R语言基础的学习与交流 R语言与医学统计学

R语言入门第五讲:使用matrix创建矩阵

2016-05-11 22:33 Anonymous

今天第五篇~~~~

 

 

 

 

 

前面我给大家介绍了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

第一种方法虽然步骤比较多,但是并不一定是麻烦的,例如我们填入的数字是“1568413296784125533189”,并不规律,那么可能第一种方法就比较适用了。当然你也可以用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=c13579111315)

> 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个向量ABC,这时我们想把它们按照列构建到矩阵中。如果直接使用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

34列。

该函数也可以“反”着使用,即创建一个拥有多少维度的向量:

> 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,第二行表示用dimx向量变成三行四列的形式。

 

说到“反着使用”,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语言 更多文章 公众号的相关说明 R语言入门第一讲:读取数据的第一步:read.table函数 R语言入门第二讲:读取数据------函数read.table第二讲 R语言入门第三讲:一些简单的运算函数 R语言入门第四讲:用cbind\/rbind结合向量
猜您喜欢 数据库系列教程六:数据库事务 携程无线新旅程 大数据商机:用户打瞌睡都值钱 【干货】超级有用的9个PHP代码片段 流量为王的时代已结束,如何用数据精细优化产品?超实用案例!