如何在R中对三维数组中的每个矩阵进行应用?

问题描述 投票:0回答:1

如果你有一个函数 f 的方法来接收一个矩阵,并返回一个不同维度的矩阵。有没有一种方法可以使用R的 applyf 为一个三维数组中的每个矩阵返回一个改变了维度的数组。

例如,假设我有

f <- function(m)(m[,1:2] + m[,3:4]) / rowSums(m)

和阵列

A <- array(1:40, dim = c(2,5,4))

然后,如果我把维度解释为(2)矩阵的指数,我在第一个矩阵上得到。

> f1(A[1,,])
          [,1]      [,2]
[1,] 0.3437500 0.6562500
[2,] 0.3611111 0.6388889
[3,] 0.3750000 0.6250000
[4,] 0.3863636 0.6136364
[5,] 0.3958333 0.6041667

那是一个c(5,2)矩阵. 我一直在想: apply 作为 "为每个margin slice做这个函数",相信我可以做到。

> apply(A, 1, f1)
           [,1]      [,2]
 [1,] 0.3437500 0.3529412
 [2,] 0.3611111 0.3684211
 [3,] 0.3750000 0.3809524
 [4,] 0.3863636 0.3913043
 [5,] 0.3958333 0.4000000
 [6,] 0.6562500 0.6470588
 [7,] 0.6388889 0.6315789
 [8,] 0.6250000 0.6190476
 [9,] 0.6136364 0.6086957
[10,] 0.6041667 0.6000000

这是Rbind'edstacked的结果,用dim c(10,2)表示,我想把它们作为c(2,5,2)数组.

r arrays apply dimensions
1个回答
1
投票

如果我们不想简化,一个选项是

apply(A, 1, function(x) list(f1(x)))

或转换为 array

array(apply(A, 1, f1), dim = c(2, 5, 2))

基于以下结果 f1(A[1,,]),输出可以是

array(apply(A, 1, f1), dim = c(5, 2, 2))
© www.soinside.com 2019 - 2024. All rights reserved.