我想找到在数组切片中应用函数的最简单方法,其中函数的每个应用程序返回一个矩阵,并接收一个合理的数组对象作为最终答案。
我觉得应该有一个简单的方法来使用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
。
答案 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" ...