每当我想在 R 中执行 \'map\'py 操作时,我通常会尝试使用 apply 系列中的函数。但是,我从未完全理解它们之间的区别 -- 如何 {sapply、lapply 等}...
每当我想在 R 中执行某些\'map\'py 操作时,我通常会尝试使用该 apply
系列中的函数。
然而,我从来没有完全理解它们之间的区别——{ sapply
, lapply
等} 如何将函数应用于输入/分组输入,输出会是什么样子,甚至输入可以是什么——所以我经常只是仔细检查它们直到得到我想要的。
有人可以解释一下何时如何使用哪一个吗?
我目前的理解(可能不正确/不完整)是......
p5
p6
apply(matrix, 1/2, f)
:输入是一个矩阵。输出是一个向量,其中元素 i
是 f(矩阵的第 i 行/第 i 列)
tapply(vector, grouping, f)
:输出是一个矩阵/数组,其中矩阵/数组中的元素是 f
向量分组 g
,并 g
被推送到行/列名称
by(dataframe, grouping, f)
:设为 g
分组。应用于 f
组/数据框的每一列。漂亮地打印分组和 f
每列的值。
aggregate(matrix, grouping, f)
:类似于 by
,但聚合不会漂亮地打印输出,而是将所有内容粘贴到数据框中。
附带问题:我还没有学过 plyr 或 reshape - 是否会 plyr
完全 reshape
取代这些?
乔兰 (Joran) 的精彩回答 开始 —— 怀疑有什么可以比这更好。
那么以下助记符可能有助于记住它们之间的区别。虽然有些是显而易见的,但其他的可能不那么明显——对于这些,你可以在 Joran 的讨论中找到依据。
助记符
lapply
是一个 列表 应用,它作用于列表或向量并返回一个列表。
sapply
很 简单 lapply
(函数默认在可能的情况下返回向量或矩阵)
vapply
是 经过验证的应用 (允许预先指定返回对象类型)
rapply
是 对嵌套列表(即列表中的列表)的 递归
tapply
是一个 标记 应用,其中的标签标识子集
apply
是 通用的 :将函数应用于矩阵的行或列(或者更一般地,应用于数组的维度)
建立正确的背景
如果使用 apply
家庭对你来说仍然感觉有点陌生,那么可能是因为你缺少了一个关键的观点。
这两篇文章可以提供帮助。它们提供了必要的背景知识,以激发 函数系列 提供的 apply
函数式编程技术
Lisp 的用户会立即认出这个范式。如果你不熟悉 Lisp,一旦你理解了 FP,你就会获得一个在 R 中使用的强大观点——而且 apply
会更有意义。