![大数据分析与应用实战:统计机器学习之数据导向编程](https://wfqqreader-1252317822.image.myqcloud.com/cover/943/44509943/b_44509943.jpg)
1.3.2 矩阵
矩阵是二维数组,与向量对象一样,每个元素的数据类型必须相同。套件{datasets}中有一个矩阵对象state.x77,它是美国50州的统计数据(如人口、收入、治安、气候与面积等)。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P36_19844.jpg?sign=1738824553-mKpoVmTPeFiGuTsBw6EEkTpqcdesMDBt-0-27878ad500b3747a9865f84436700d35)
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P37_19845.jpg?sign=1738824553-4JmfRR3pHpBwltJjLSWRwaeXo8HTUjTr-0-ff9787576311cc9797c25cade0d4d238)
state.x77是matrix类型的对象,在查询维度名称时请注意,names()只能用来查询向量、列表(1.3.4节)与数据集(1.3.5节)等广义的一维对象中元素或变量名称,此处用于matrix上则返回空值。因此,查询矩阵行名及列名时须用dimnames(),而非names()。通过dimnames()返回结果的两个成对中括号内的列表元素编号,读者可发现:50×8矩阵的50个行名与8个列名字符串向量因长度的不同,所以组织成1.3.4节将提到的列表对象。
R语言面向对象的类别概念比较紊乱,有多个函数可返回对象的类型,前述class()函数是从面向对象泛型函数(参见1.6节编程范式与面向对象概念)的视角,返回对象的类型,也就是说任何可以处理matrix类型对象的泛型函数,都可以施加在state.x77上。此外,typeof()函数从R语言内部的视角返回对象类型;而mode()则从S语言的视角返回对象类型或模态(mode),与其他S语言的工具兼容性更高;storage.mode()则与R对象传到编译代码中的任务有关 。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P38_20058.jpg?sign=1738824553-jUPiV7TgJUXWDDCUKoOf1ZOkZntf67R4-0-274bdbbdfc85cde8eead6a7acf4871a0)
· 矩阵创建的函数是matrix(),语法如下:
mymatrix<-matrix(向量对象,nrow=行数,ncol=列数,byrow=逻辑值,dimnames=list(行名字符串向量,列名字符串向量))
下例中先使用字符粘贴函数paste0()产生行名与列名字符串向量,请注意R语言以及Python语言的numpy模块因为向量化运算的特征,都会将长度较短的向量(此例中为"row"与"col")自动放大为等长的向量,再按照对应元素进行粘贴操作。关于这种特性,R语言称为循环(recycle),而Python则命名为广播(broadcasting)。最后,matrix()创建函数中,因为各维因子水平数不一定相同,用1.3.4节将介绍的列表创建函数list(),组织其各维名称向量dimnames。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P39_19847.jpg?sign=1738824553-SaRDir0kScxGnfahYbCI16yULmFH0rSJ-0-cbb823ba638eae94f89689e76002899d)