每当我想在 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
取代这些?
尽管这里有很多很棒的答案,但还有两个基本函数值得一提,即有用的 outer
函数和模糊的 eapply
函数
外
outer
是一个非常有用的功能,但却隐藏在普通功能中。如果你阅读帮助,你 outer
会发现它的描述是这样的:
The outer product of the arrays X and Y is the array A with dimension
c(dim(X), dim(Y)) where element A[c(arrayindex.x, arrayindex.y)] =
FUN(X[arrayindex.x], Y[arrayindex.y], ...).
这看起来似乎只对线性代数类型的东西有用。但是,它的用法很像 mapply
将函数应用于两个输入向量。不同之处在于, mapply
将函数应用于前两个元素,然后应用于后两个元素,等等,而 outer
将函数应用于第一个向量中的一个元素和第二个向量中的一个元素的每个组合。例如:
A<-c(1,3,5,7,9)
B<-c(0,3,6,9,12)
mapply(FUN=pmax, A, B)
> mapply(FUN=pmax, A, B)
[1] 1 3 6 9 12
outer(A,B, pmax)
> outer(A,B, pmax)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 6 9 12
[2,] 3 3 6 9 12
[3,] 5 5 6 9 12
[4,] 7 7 7 9 12
[5,] 9 9 9 9 12
当我有一个值向量和一个条件向量并希望看到哪些值满足哪些条件时,我个人使用过这个。
申请
eapply
类似于 lapply
,只不过它不是将函数应用于列表中的每个元素,而是将函数应用于环境中的每个元素。例如,如果您想在全局环境中查找用户定义函数的列表:
A<-c(1,3,5,7,9)
B<-c(0,3,6,9,12)
C<-list(x=1, y=2)
D<-function(x){x+1}
> eapply(.GlobalEnv, is.function)
$A
[1] FALSE
$B
[1] FALSE
$C
[1] FALSE
$D
[1] TRUE
坦率地说,我并不经常使用它,但如果您正在构建很多包或创建很多环境,它可能会派上用场。