Ang*_*gie 2 arrays loops for-loop r matrix
我遇到以下问题:
我有一个尺寸为 dim(x)= (46, 13, 30) 的大数组“x”。我正在尝试计算一个新的矩阵“M”(30,598),它基本上包含第一列中每个“切片”的第一个元素,第二列中的第二个元素,依此类推......最终,我想与包含每个网格单元的所有元素的向量(M 的列)。
使用以下函数,我将能够计算矩阵 M。但是,考虑到大型数组,这并不完全是一个用户友好的解决方案:
M <- cbind(x[1,1,],x[1,2,],x[1,3,],x[1,4,],x[2,1,],x[2,2,], x[2,3,],x[2,4,]......)
Run Code Online (Sandbox Code Playgroud)
这就是为什么我想使用 for 循环。不幸的是我不知道如何。
这是我到目前为止尝试过的(不成功):
M <- matrix(NA, nrow = 6, ncol = 20)
for (i in 1:120){
M[i] <- cbind(x[,,i])
}
Run Code Online (Sandbox Code Playgroud)
该循环仅创建第一个向量(每个“切片”[1,1,] 的第一个元素),然后中止。
关于如何完成这项工作有什么想法吗?非常感谢您的帮助!
样本数据:
set.seed(1) ; x <- array(rnorm(2*3*5), dim = c(2, 3, 5))
# , , 1
#
# [,1] [,2] [,3]
# [1,] -0.6264538 -0.8356286 0.3295078
# [2,] 0.1836433 1.5952808 -0.8204684
#
# , , 2
#
# [,1] [,2] [,3]
# [1,] 0.4874291 0.5757814 1.5117812
# [2,] 0.7383247 -0.3053884 0.3898432
#
# , , 3
#
# [,1] [,2] [,3]
# [1,] -0.6212406 1.12493092 -0.01619026
# [2,] -2.2146999 -0.04493361 0.94383621
#
# , , 4
#
# [,1] [,2] [,3]
# [1,] 0.8212212 0.9189774 0.07456498
# [2,] 0.5939013 0.7821363 -1.98935170
#
# , , 5
#
# [,1] [,2] [,3]
# [1,] 0.61982575 -0.1557955 -0.4781501
# [2,] -0.05612874 -1.4707524 0.4179416
Run Code Online (Sandbox Code Playgroud)
然后将维度排列apply() identity(或者,等效地,as.vector甚至c,参见?apply)到第三维并转置:
res <- t(apply(aperm(x, c(3, 2, 1)), 1, identity))
# [,1] [,2] [,3] [,4] [,5] [,6]
# [1,] -0.6264538 -0.8356286 0.32950777 0.18364332 1.59528080 -0.8204684
# [2,] 0.4874291 0.5757814 1.51178117 0.73832471 -0.30538839 0.3898432
# [3,] -0.6212406 1.1249309 -0.01619026 -2.21469989 -0.04493361 0.9438362
# [4,] 0.8212212 0.9189774 0.07456498 0.59390132 0.78213630 -1.9893517
# [5,] 0.6198257 -0.1557955 -0.47815006 -0.05612874 -1.47075238 0.4179416
Run Code Online (Sandbox Code Playgroud)
同样,根据 @Frank 的建议:res <- matrix(aperm(x, c(3, 2, 1)), dim(x)[3])
最后:
desired_output <- cbind(x[1,1,],x[1,2,],x[1,3,],x[2,1,],x[2,2,], x[2,3,])
all.equal(res, desired_output)
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)