R:应用于数组的切片和 return 数组

R: Apply to slices of an array and return an array

我想找到跨数组切片应用函数的最简单方法,其中函数的每次应用 returns 一个矩阵,并接收一个合理的数组对象作为最终答案。

我觉得应该有一个简单的方法来使用 apply 函数来执行此操作,但我觉得我需要一个 simplify = 'array' 选项,这会非常方便。我得到的最接近的是:

dims = c(2,3,10,4,5)
arr = array(runif(prod(dims)),dim = dims, dimnames = 
          list(
            paste0('a',1:dims[1]),
            paste0('b',1:dims[2]),
            paste0('c',1:dims[3]),
            paste0('d',1:dims[4]),
            paste0('e',1:dims[5])
          ))

result = apply(arr, c(4,5), function(x) apply(x, c(3), function(y) (y - y[,1])^2 ) )

result 应该是维度为 c(2,3,10,4,5) 或其某种排列的数组。

我可以通过在 result 上以适当的尺寸调用 as.array 来获得正确的形式,但是应该有一种更简单的方法可以自动保留 dimnames

这可以通过 plyr 包中的 aaply 函数来完成。这是这个包中的几个应用函数之一,其中的命名约定是 aaply 中的 aa 代表数组到数组。

dims = c(2,3,10,4,5)
arr = array(runif(prod(dims)),dim = dims, dimnames = 
          list(
            paste0('a',1:dims[1]),
            paste0('b',1:dims[2]),
            paste0('c',1:dims[3]),
            paste0('d',1:dims[4]),
            paste0('e',1:dims[5])
          ))

aresult = (aaply(arr, c(4,5), function(x) aaply(x, c(3), function(y) (y - y[,1])^2 ) ) )
result = aperm(abind(aresult), c(4,5,3,1,2))

要使用 apply 遍历多维数组,请指定要保留的边距。二维可视化更容易:

m <- matrix(1, 2, 3)

m
#>      [,1] [,2] [,3]
#> [1,]    1    1    1
#> [2,]    1    1    1

apply(m, 1, sum)
#> [1] 3 3

—迭代行保持该维度,并折叠未提及的第一列。对于所讨论的更复杂的数组,

res <- apply(arr, 2:5, function(x){mean(x^2)})
# or even just apply(arr^2, 2:5, mean) (h/t @thelatemail)

str(res)
#>  num [1:2, 1:3, 1:4, 1:5] 0.313 0.215 0.32 0.29 0.288 ...
#>  - attr(*, "dimnames")=List of 4
#>   ..$ : chr [1:2] "b1" "b2"
#>   ..$ : chr [1:3] "c1" "c2" "c3"
#>   ..$ : chr [1:4] "d1" "d2" "d3" "d4"
#>   ..$ : chr [1:5] "e1" "e2" "e3" "e4" ...