关于r:分组函数(tapply,by,aggregate)和* apply系列

您所在的位置:网站首页 r语言aggregate函数 关于r:分组函数(tapply,by,aggregate)和* apply系列

关于r:分组函数(tapply,by,aggregate)和* apply系列

2024-06-26 11:18| 来源: 网络整理| 查看: 265

每当我想在R中做"map"py时,我通常会尝试在apply系列中使用一个函数。

但是,我从来没有完全理解它们之间的区别 - {sapply,lapply等}如何将函数应用于输入/分组输入,输出将是什么样的,甚至输入可以是什么所以我经常只是经历它们直到我得到我想要的东西。

有人可以解释如何使用哪一个?

我当前(可能不正确/不完整)的理解是......

sapply(vec, f):输入是向量。输出是矢量/矩阵,其中元素i是f(vec[i]),如果f具有多元素输出,则为您提供矩阵

lapply(vec, f):与sapply相同,但输出是一个列表?

apply(matrix, 1/2, f):输入是一个矩阵。 output是一个向量,其中element i是f(矩阵的row / col i) tapply(vector, grouping, f):输出是矩阵/阵列,其中所述基质/数组中的元素是的值在一组g载体,并g被推到行/列名 by(dataframe, grouping, f):让g成为分组。将f应用于组/数据帧的每一列。在每列打印分组和f的值。 aggregate(matrix, grouping, f):类似于by,但是聚合不是将输出完全打印到数据帧中。

附带问题:我还没有学过plyr或重塑 - 将plyr或reshape完全取代所有这些?

相关讨论 对于你的问题:对于很多事情,plyr是*apply()和by的直接替代品。 plyr(至少对我来说)似乎更加一致,因为我总是确切地知道它所期望的数据格式以及它将吐出的确切内容。这为我省去了很多麻烦。 另外,我建议添加:doBy以及data.table的选择和应用功能。 sapply只是lapply,在输出上添加了simplify2array。 apply强制转换为原子矢量,但输出可以是矢量或列表。 by将数据帧拆分为子数据帧,但它不单独使用f列。只有存在'data.frame'类的方法时,f才能通过by逐列应用。 aggregate是通用的,因此对于第一个参数的不同类存在不同的方法。 助记符:l代表'list',s代表'简化',t代表'per type'(分组的每个级别都是一个类型) Rfast包中也存在一些函数,例如:eachcol.apply,apply.condition等等,它们比R的等价物快。

R具有许多*应用功能,这些功能在帮助文件中有很好的描述(例如?apply)。但是,他们已经足够了,开始使用R可能很难决定哪一个适合他们的情况甚至记住它们。他们可能会有一个普遍的感觉,"我应该在这里使用* apply函数",但最初要保持一致是很困难的。

尽管事实(在其他答案中指出)* apply系列的大部分功能都被极受欢迎的plyr包覆盖,但基本功能仍然有用且值得了解。

这个答案旨在作为一种新的useRs的路标,以帮助指导他们针对他们的特定问题正确的*应用功能。注意,这不是为了简单地反刍或替换R文档!希望这个答案可以帮助您确定哪种*应用功能适合您的情况,然后由您来进一步研究。除了一个例外,性能差异将无法解决。

apply - 当您要将函数应用于行或列时 矩阵(和更高维的类似物);通常不建议使用数据帧,因为它会首先强制转换为矩阵。

123456789101112131415161718192021222324252627# Two dimensional matrix M


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3