如何使用 R 中 3 维数组中的每个矩阵
How use apply for each matrix in 3-d array in R
如果您有一个函数 f
接受一个矩阵并且 return 是一个具有不同维度的矩阵。有没有一种方法可以将 R 的 apply
与 f
用于 3 维数组中的每个矩阵和 return 具有更改维度的数组。
比如说我有
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
是 "do this function for each 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'ed/stacked 和 dim c(10,2) 的结果,我希望它们作为 c(2,5,2) 数组。
如果我们不想简化,一个选项是
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))
如果您有一个函数 f
接受一个矩阵并且 return 是一个具有不同维度的矩阵。有没有一种方法可以将 R 的 apply
与 f
用于 3 维数组中的每个矩阵和 return 具有更改维度的数组。
比如说我有
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
是 "do this function for each 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'ed/stacked 和 dim c(10,2) 的结果,我希望它们作为 c(2,5,2) 数组。
如果我们不想简化,一个选项是
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))