我发现了一个令人惊讶的行为apply,我想知道是否有人可以解释.让我们采取一个简单的矩阵:
> (m = matrix(1:8,ncol=4))
[,1] [,2] [,3] [,4]
[1,] 1 3 5 7
[2,] 2 4 6 8
Run Code Online (Sandbox Code Playgroud)
我们可以垂直翻转它:
> apply(m, MARGIN=2, rev)
[,1] [,2] [,3] [,4]
[1,] 2 4 6 8
[2,] 1 3 5 7
Run Code Online (Sandbox Code Playgroud)
这将rev()迭代地将矢量反转函数应用于每列.但是当我们尝试逐行应用时,我们得到:
> apply(m, MARGIN=1, rev)
[,1] [,2]
[1,] 7 8
[2,] 5 6
[3,] 3 4
[4,] 1 2
Run Code Online (Sandbox Code Playgroud)
..逆时针旋转90度!Apply使用相同的结果,FUN=function(v) {v[length(v):1]}因此绝对不是转速的错误.
对此有何解释?
该文档指出
如果每次调用 FUN 返回一个长度为 n 的向量,则 apply 返回一个维度为 c(n, dim(X)[MARGIN]) 的数组(如果 n > 1)。
从这个角度来看,这种行为无论如何都不是一个错误,这就是它的工作原理。
人们可能想知道为什么选择它作为默认设置,而不是保留原始矩阵的结构。考虑以下示例:
> apply(m, 1, quantile)
[,1] [,2]
0% 1.0 2.0
25% 2.5 3.5
50% 4.0 5.0
75% 5.5 6.5
100% 7.0 8.0
> apply(m, 2, quantile)
[,1] [,2] [,3] [,4]
0% 1.00 3.00 5.00 7.00
25% 1.25 3.25 5.25 7.25
50% 1.50 3.50 5.50 7.50
75% 1.75 3.75 5.75 7.75
100% 2.00 4.00 6.00 8.00
> all(rownames(apply(m, 2, quantile)) == rownames(apply(m, 1, quantile)))
[1] TRUE
Run Code Online (Sandbox Code Playgroud)
持续的?确实,我们为什么还要期待其他事情呢?