开发者社区> 华章计算机> 正文

《R语言编程艺术》——3.3 对矩阵的行和列调用函数

简介: 本节书摘来自华章计算机《R语言编程艺术》一书中的第3章,第3.3节,作者:(美)麦特洛夫(Matloff,N.)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
+关注继续查看

3.3 对矩阵的行和列调用函数

*apply()函数系列是R中最受欢迎同时也是最常用的,该函数系列包括apply()、tapply()和lapply()。这里我们主要介绍apply()。apply()函数允许用户在矩阵的各行或各列上调用指定的函数。
3.3.1 使用apply()函数
以下是apply()函数的一般形式:
image

参数解释如下:
m 是一个矩阵。
dimcode 是维度编号,若取值为1代表对每一行应用函数,若取值为2代表对每一列应用函数。
f是应用在行或列上的函数。
fargs是f的可选参数集。
例如,对矩阵z的每一列应用函数mean():

image

本例也可以用colMeans()函数直接实现,不过这里主要为了提供使用apply()的简单示例。
apply()里也可以使用用户自己定义的函数,就和使用R内部函数(比如mean())一样。下面是使用自定义函数f的例子:

image

f()函数把一个向量除以(2,8)。(如果向量x的长度大于2,那么(2,8)就会循环补齐)。apply()函数则对z的每一行分别调用f()。z的第一行是(1,4),所以在调用f()时,形式参数x对应的实际参数是(1,4)。然后R计算(1,4)/(2,8)的值,这在R中是向量对应元素运算,得到(0.5,0.5)。对其他两行的计算与此类似。
你可能会惊讶,所得结果y是一个2×3的矩阵而非3×2的。第一行的计算结果(0.5, 0.5)构成apply()函数输出结果的第一列,而不是第一行。这就是apply()函数的默认方式。如果所调用的函数返回的是一个包含k个元素的向量,那么apply()的结果就有k行。如果需要的话,可以使用转置函数t(),例如:
image

如果所调用的函数只返回一个标量(即单元素向量),那么apply()的结果就是一个向量,而非矩阵。
在用apply()时,待调用的函数至少需要一个参数。上例中,f()的形式参数在这里对应的实际参数就是矩阵的一行(或一列)。有时,待调用函数需要多个参数,用apply()调用这类函数时,需要把这些额外的参数列举在函数名字后面,用逗号隔开。
例如,我们有一个由0和1组成的矩阵,想要生成如下向量:向量每个元素对应矩阵的每行,如果该行前d个元素中1较多,向量的对应元素就取1,反之取0。其中d是可以变的参数。程序可以这样写:

image

这里3和2是函数copymaj()中形式参数d的实际取值。矩阵的第一行是(1,0,1,1,0),当d取3时,前d个元素是(1,0,1)。1占多数,因此copymaj()返回1。所以apply()返回的第一个元素就是1。
使用apply()函数并不像很多人以为的那样,能使程序的运行速度加快。其优点是使程序更紧凑,更易于阅读和修改,并且避免产生使用循环语句时可能带来的bug。此外,并行运算是R目前发展的方向之一,apply()这类函数会变得越来越重要。例如,snow包中的clusterApply()函数能够把子矩阵的数据分配到多个网络节点上,在每个网络节点上对子矩阵调用给定的函数,达到并行计算的目的。
3.3.2 扩展案例:寻找异常值
在统计学中,“异常值”(outlier)指的是那些和大多数观测值离得很远的少数点。所以异常值要么是有问题(例如数字写错了),要么是不具有代表性(例如比尔盖茨的收入和华盛顿州居民的收入相比)。检测异常值有很多方法,我们这里构造一个非常简单的方法。
假如矩阵rs用来存储零售业销售数据,每行对应一家商店,一行里的观测值对应每天的销售数据。我们用非常简单的方法识别出每家商店数据中偏离最远的观测值,也就是与中位数差别最大的观测值。代码如下:

image

那么上述中的findols(rs)是如何运作的?首先需要定义一个函数,作为调用apply()函数时的参数。
该函数要应用于销售数据矩阵的每一行,并返回该行中最异常的元素所在位置。函数findol()就是为完成此目的而定义的,请看代码的第4、5行。(注意,我们在一个函数的内部又定义了另一个函数。如果内部函数很短的话,这么做是很常见的。)在表达式xrow-mdn中,向量xrow减去单元素向量mdn,而前者的长度通常大于1,因此在做向量减法运算之前,mdn被循环补齐(recycling),扩展到与xrow的长度一致。
代码第五行使用R函数which.max(),而不是max()。因为max()返回的是向量元素的最大值,而which.max()返回最大值所在位置(即索引)。这正是我们需要的。
最后在第七行,对x的每一行调用findol(),得到各行“异常值”所在位置。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
《R语言编程艺术》——导读
避免显式迭代是R语言的一个常见话题,这对于函数式编程语言来说是很典型的问题。你可以利用R的函数特性把迭代行为表达成隐式的,而不是用循环语句。这可以让代码执行起来更有效率,当R运行在大数据集上时运行时间会相差很大。
1645 0
《R语言编程艺术》——3.8 高维数组
本节书摘来自华章计算机《R语言编程艺术》一书中的第3章,第3.8节,作者:(美)麦特洛夫(Matloff,N.)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1224 0
《R语言编程艺术》——3.7 矩阵的行和列的命名问题
本节书摘来自华章计算机《R语言编程艺术》一书中的第3章,第3.7节,作者:(美)麦特洛夫(Matloff,N.)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1514 0
《R语言编程艺术》——3.6 避免意外降维
本节书摘来自华章计算机《R语言编程艺术》一书中的第3章,第3.6节,作者:(美)麦特洛夫(Matloff,N.)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1144 0
《R语言编程艺术》——3.5 向量与矩阵的差异
本节书摘来自华章计算机《R语言编程艺术》一书中的第3章,第3.5节,作者:(美)麦特洛夫(Matloff,N.)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
893 0
《R语言编程艺术》——3.4 增加或删除矩阵的行或列
本节书摘来自华章计算机《R语言编程艺术》一书中的第3章,第3.4节,作者:(美)麦特洛夫(Matloff,N.)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
4352 0
《R语言编程艺术》——3.2 一般矩阵运算
本节书摘来自华章计算机《R语言编程艺术》一书中的第3章,第3.2节,作者:(美)麦特洛夫(Matloff,N.)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
2044 0
《R语言编程艺术》——3.1 创建矩阵
本节书摘来自华章计算机《R语言编程艺术》一书中的第3章,第3.1节,作者:(美)麦特洛夫(Matloff,N.)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1062 0
《R语言编程艺术》——第3章 3.0 矩阵和数组
本节书摘来自华章计算机《R语言编程艺术》一书中的第3章,第3.0节,作者:(美)麦特洛夫(Matloff,N.)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1177 0
《R语言编程艺术》——2.12 关于c()的更多内容
本节书摘来自华章计算机《R语言编程艺术》一书中的第2章,第2.12节,作者:(美)麦特洛夫(Matloff,N.)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1115 0
《R语言编程艺术》——2.11 向量元素的名称
本节书摘来自华章计算机《R语言编程艺术》一书中的第2章,第2.11节,作者:(美)麦特洛夫(Matloff,N.)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1095 0
《R语言编程艺术》——2.10 测试向量相等
本节书摘来自华章计算机《R语言编程艺术》一书中的第2章,第2.10节,作者:(美)麦特洛夫(Matloff,N.)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1320 0
《R语言编程艺术》——2.9 向量化的ifelse()函数
本节书摘来自华章计算机《R语言编程艺术》一书中的第2章,第2.9节,作者:(美)麦特洛夫(Matloff,N.)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
2503 0
《R语言编程艺术》——2.8 筛选
本节书摘来自华章计算机《R语言编程艺术》一书中的第2章,第2.8节,作者:(美)麦特洛夫(Matloff,N.)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1330 0
《R语言编程艺术》——2.7 NA与NULL值
本节书摘来自华章计算机《R语言编程艺术》一书中的第2章,第2.7节,作者:(美)麦特洛夫(Matloff,N.)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1370 0
+关注
华章计算机
文章
问答
视频
来源圈子
更多
+ 订阅
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载