R:应用于数组的切片并返回一个数组

时间:2017-03-31 02:05:06

标签: arrays r apply

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

我觉得应该有一个简单的方法来使用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)的数组或其中的一些排列。

我可以通过as.array使用适当的维度调用result来获得正确的表单,但应该有一种更简单的方法可以自动保留dimnames

2 个答案:

答案 0 :(得分:1)

可以使用aaply包中的plyr函数完成此操作。这是此包中的几个apply函数之一,其中命名约定是aa中的aaply代表数组到数组。

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))

答案 1 :(得分:0)

要使用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

-intrating on rows保留该维度,并折叠未提及的第一列。对于更复杂的数组,那么,

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" ...