每当我想在 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
取代这些?
我最近发现了一个相当有用的 sweep
功能,为了完整性起见,在这里添加它:
扫
基本思想是 扫描 数组并返回修改后的数组。下面这个例子可以清楚地说明这一点(来源: datacamp ):
假设您有一个矩阵并想 按列对其 进行标准化
dataPoints <- matrix(4:15, nrow = 4)
# Find means per column with `apply()`
dataPoints_means <- apply(dataPoints, 2, mean)
# Find standard deviation with `apply()`
dataPoints_sdev <- apply(dataPoints, 2, sd)
# Center the points
dataPoints_Trans1 <- sweep(dataPoints, 2, dataPoints_means,"-")
# Return the result
dataPoints_Trans1
## [,1] [,2] [,3]
## [1,] -1.5 -1.5 -1.5
## [2,] -0.5 -0.5 -0.5
## [3,] 0.5 0.5 0.5
## [4,] 1.5 1.5 1.5
# Normalize
dataPoints_Trans2 <- sweep(dataPoints_Trans1, 2, dataPoints_sdev, "/")
# Return the result
dataPoints_Trans2
## [,1] [,2] [,3]
## [1,] -1.1618950 -1.1618950 -1.1618950
## [2,] -0.3872983 -0.3872983 -0.3872983
## [3,] 0.3872983 0.3872983 0.3872983
## [4,] 1.1618950 1.1618950 1.1618950
注意:对于这个简单的例子,当然可以通过以下方式更轻松地实现相同的结果 apply(dataPoints, 2, scale)