【发布时间】:2017-08-25 03:57:47
【问题描述】:
我想找到跨数组切片应用函数的最简单方法,其中函数的每个应用都返回一个矩阵,并接收一个合理的数组对象作为最终答案。
我觉得应该有一个简单的方法来使用 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。
【问题讨论】:
-
要使用
apply,请指定要保留的边距:apply(arr, 2:5, function(x){mean(x^2)}) -
@alistaire - 这绝对应该是一个答案 - 它非常简单。
apply(arr^2, 2:5, mean)甚至可以在这种特殊情况下工作。 -
对不起,我举了一个不好的例子。我将更正示例以符合问题的措辞和实际目标...