想象一下,你有一个包含行,列和层的三维数组:
A <- array (1:27, c(3,3,3))
Run Code Online (Sandbox Code Playgroud)
并且假设你有一个函数将矩阵作为输入并返回矩阵作为输出,如t.
如何将该函数应用于数组的每一层,返回与第一层相同大小的另一个数组?
我觉得我应该能够以apply某种方式做到这一点,但我做不到.
奖金问题(如果你回答这个问题,我将非常感激):这样做是否更快,或者为每个层矩阵和lapply函数制作一个列表?
-
编辑:请不要认为这个问题得到了回答 - 下面的答案没有回答这个问题.
您必须考虑要提取值的边距.
您可以3rd通过应用尺寸1和2(行和列,以获得更好的单词)来转置每个尺寸矩阵
apply(A,1:2,t)
, , 1
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 10 11 12
[3,] 19 20 21
, , 2
[,1] [,2] [,3]
[1,] 4 5 6
[2,] 13 14 15
[3,] 22 23 24
, , 3
[,1] [,2] [,3]
[1,] 7 8 9
[2,] 16 17 18
[3,] 25 26 27
Run Code Online (Sandbox Code Playgroud)
您也可以使用plyr,aaply并且可以更直观地采取行动
library(plyr)
aaply(A,3,t)
, , = 1
X1 1 2 3
1 1 4 7
2 10 13 16
3 19 22 25
, , = 2
X1 1 2 3
1 2 5 8
2 11 14 17
3 20 23 26
, , = 3
X1 1 2 3
1 3 6 9
2 12 15 18
3 21 24 27
Run Code Online (Sandbox Code Playgroud)
至于哪个更快lapply或者apply,我认为也许lapply会赢,但你仍然需要考虑你想从哪个边缘提取矩阵.
我通常发现在一个维度上思考要容易得多.如果地球平坦,一切都会更直接!