R语言初级教程(15): 矩阵(下篇)

Python011

R语言初级教程(15): 矩阵(下篇),第1张

这是最后一篇讲解有关矩阵操作的博客,介绍有关矩阵的函数,主要有 rowSums() , colSums() , rowMeans() , colMeans() , apply() , rbind() , cbind() , row() , col() , rowsum() , aggregate() , sweep() , max.col() 。

下面通过例子来了解这些函数的用法:

我们知道,通过下标索引 [i, j] 可以访问矩阵的某一部分,索引如果没有提供意味着“所有行”或“所有列”。来看个例子,比如:

在R中,可以用一些特殊的函数来进行矩阵的行、列计算。来看些例子:

上述矩阵的行、列计算,还可以使用 apply() 函数来实现。 apply() 函数的原型为 apply(X, MARGIN, FUN, ...) ,其中: X 为矩阵或数组; MARGIN 用来指定是对行运算还是对列运算, MARGIN=1 表示对行运算, MARGIN=2 表示对列运算; FUN 用来指定运算函数; ... 用来指定 FUN 中需要的其它参数。来看些例子:

用 apply() 函数来实现上面的例子

apply() 函数功能很强大,我们可以对矩阵的行或列进行其它运算,例如:

如果矩阵存在 NA 值,可通过设置 na.rm=TRUE 来忽略 NA 值,然后再计算。比如:

甚至我们还可以自定义运算函数,来看个例子:

在R中, rbind() 和 cbind() 函数可分别为矩阵添加行和列,来看一个例子:

在R中, row() 和 col() 函数将分别返回元素的行和列下标矩阵,来看个例子:

通过这两个函数,可以获取矩阵的对角元素以及上下三角矩阵,例如:

有时,你可能需要对每行进行分组,然后组内每列求和。在R中可以用 rowsum() 函数来解决,而且效率也非常高。先看个例子:

你也可以用 aggregate() 函数获得类似结果:

有人就会问“为啥没有列分组求和的操作?”,其实你可以先将矩阵转置,然后行分组求和;这两步就等同于列分组求和。

sweep() 函数的原型为 sweep(x, MARGIN, STATS, FUN = "-", check.margin = TRUE, ...) ,其中: x 为矩阵或数组; MARGIN 用来指定是对行运算还是对列运算, MARGIN=1 表示对行运算, MARGIN=2 表示对列运算; STATS 表示想要清除的统计量; FUN 用来指定运算函数,默认为减法 - ; check.margin 用来核实 x 的维度是否与 STATS 的匹配,如果事先知道它们匹配的话,将其设为 FALSE 将提高运算速度; ... 用来指定 FUN 中需要的其它参数。来看些例子:

事实上,通过改变 FUN 参数的具体形式或自定义函数, sweep() 函数可以实现很多不同操作,这里就不细讲了。

max.col() 函数返回矩阵每行最大值所在的列位置(即列下标),其原型为 max.col(m, ties.method = c("random", "first", "last")) ,其中: m 为矩阵;当存在多个最大值时, ties.method 指定用哪种方式来处理这种情况,默认为"random"(随机),"first"指使用第一个最大值,"last"指使用最后一个最大值。来看个官网例子:

我们也可以结合 apply() 和 which.max() 函数来实现 max.col(mm, 'first') 。看个例子,

R矩阵的最后一部分内容就讲到这。

如若有遗漏,后期将会添加至本博客。

之前我们讲了向量,向量就仿佛一个一维数组一样

那么我们接下来就讲讲二维数组

创建一个matrix需要用到matrix函数

martix(参数1,nrow=行数,ncol=列数,byrow=布尔值)

参数1:matrix初始化的值,如果给出的值不够matrix长度将重复赋值,如果给出的值溢出将会报错。

参数byrow:这是一个布尔值如果给定TRUE,初始数据按行顺序推进,反之按列顺序推进。

这里说一下R语言中 ' . ' 并没有特殊的意义,只是变量名的一部分

读取矩阵我们用到:矩阵名[行,列]

这里的行和列可以接收单个数组也可以接收一个向量

当然如果是负数和向量一样就是排除掉对应索引指向的值

test.m[2, ]    #取第二行,我们注意这里把列的地方空出来就是显示所有列

test.m[ ,2]     #取第二列

test.m[2,2]    #取第二行第二个

我们也可以给索引一个向量 比如3:4或者c(1,4)之类的,如上图所示,索引值也可以不连续

我们知道在二维表中 我们通常给每一行每一列取一个名字

矩阵中我们也可以这样做

首先我们给每一行每一列取一个名字,用向量保存

之后我们使用rownames(矩阵名)<-存有名字的向量给每行取名,给列取名同理见上图

取名之后我们可以用名称代替下标访问,例如:test.m['2nd','二']

看到这里,我真的觉得数据分析相关专业十分的艰难,需要用一些稀奇古怪的东西来进行数据分析

因为本人是计科专业的,平时用的数组就是单纯的数组,R语言的数组我一开始是令我怀疑人生的。

创建一个数组我们需要用到array函数

array(data=数组中的数据从1维平铺, dim=给定一个数值型向量, dimnames=list(包含一维名称的向量,二维名称....))

其中data参数用来给出数组的数据从第一维第一个开始顺序向后平铺

dim给定数组的纬度和每纬的宽度

dimnames给每个纬度的每格的名字    #这个参数可以忽略

至于如何读取数组中的数据和矩阵一致这里不再叙述,只不过把二维改成多维的情况。

我截完图发现arr[2,2,2]这个例子并不好,如果我们查看arr[3,2,1]将会显示6。