Jac*_*ner 5 r multidimensional-array
我需要一个在R中子集多维数组的函数; 在我调用函数之前,我不知道该维度的哪个维度或长度.
# subset a 3-d array; leave dims 1 and 2, but start 3rd dim at its 11th value
mydim <- dim(myarr)
myarr[, , 11:mydim[3]]
# subset a 4-d array; leave dims 1, 3 and 4, but start 2rd dim at its 8th value
mydim <- dim(myarr)
myarr[, 8:mydim[2], , ]
Run Code Online (Sandbox Code Playgroud)
我总是需要精确地沿着一个维度子集,该子集总是比1.我还需要保持阵列结构的其他一些值来启动,所以矩阵索引到数组看起来并不吸引人.提前致谢.
这是一个利用基于矩阵对数组进行子集化的可能性的选项:
myarr <- array(1:(2*3*4), dim = c(2, 3, 4))
myfun <- function(arr, from, len, Dim){
dimArr <- dim(arr)
if(missing(len)){
subIdx <- from:dimArr[Dim]
} else {
subIdx <- from:(from + len - 1)
}
arrD <- lapply(as.list(dimArr), seq_len)
arrD[[Dim]] <- subIdx
subMat <- as.matrix(do.call(expand.grid, arrD))
array(arr[subMat], dim = lapply(arrD, length))
}
> myfun(myarr, 2, 1, 3)
, , 1
[,1] [,2] [,3]
[1,] 7 9 11
[2,] 8 10 12
> myfun(myarr, 2, Dim = 3)
, , 1
[,1] [,2] [,3]
[1,] 7 9 11
[2,] 8 10 12
, , 2
[,1] [,2] [,3]
[1,] 13 15 17
[2,] 14 16 18
, , 3
[,1] [,2] [,3]
[1,] 19 21 23
[2,] 20 22 24
Run Code Online (Sandbox Code Playgroud)