用于多维数组的rollapply(R)



不是二维数组(R(的rollapply的副本,而是对它的详细阐述——我实际上想做的比这个问题中描述的稍微复杂一些。我希望这个问题的任何答案都能很容易地延伸到我实际问题的解决方案,但不幸的是,事实并非如此

对于简单矢量,我们有

> a <- c(1:4)
> a
[1] 1 2 3 4
> rollapply(a, 2, mean)
[1] 1.5 2.5 3.5

虽然rollapply本身仅限于一维向量,但一些非常有用的答案,如akrun的这个答案,使我能够以多种方式将其扩展到二维阵列。

不幸的是,我现在又陷入了困境,因为我看不出任何答案是如何推广到比两个(*(更高的维度的。取阵列b

> b <- array(rep(c(1:4),each=6), c(2,3,4))
> b
, , 1
[,1] [,2] [,3]
[1,]    1    1    1
[2,]    1    1    1
, , 2
[,1] [,2] [,3]
[1,]    2    2    2
[2,]    2    2    2
, , 3
[,1] [,2] [,3]
[1,]    3    3    3
[2,]    3    3    3
, , 4
[,1] [,2] [,3]
[1,]    4    4    4
[2,]    4    4    4

应该有一些方法在2的窗口大小上采取措施来产生

, , 1
[,1] [,2] [,3]
[1,]  1.5  1.5  1.5
[2,]  1.5  1.5  1.5
, , 2
[,1] [,2] [,3]
[1,]  2.5  2.5  2.5
[2,]  2.5  2.5  2.5
, , 3
[,1] [,2] [,3]
[1,]  3.5  3.5  3.5
[2,]  3.5  3.5  3.5

但我看不出是怎么回事(很明显,在实际情况下,子数组不会只是在整个数组中重复相同的整数,而是包含实际数据(。

理想情况下,我还希望能够为窗口中的各个子数组分配不同的权重,以达到平均的目的,但我认为这只是定义一个要应用的自定义函数的问题。

(*(也许有一个显而易见的方法,但我现在已经很晚了,我找不到了。

我无法让zoo::rollapply工作(作为一个外部调用,不同于它在其中一个注释中的内部使用(,但可以通过外部控制输入向量(seq_len(dim(b)[3])[-1](和";窗口";(外部为[-1],内部为i-1:0(。从那里看,这只是阵列中一个昏暗区域的平均值:

sapply(seq_len(dim(b)[3])[-1],
function(i) apply(b[,,i-1:0,drop=FALSE], 1:2, mean),
simplify="array")
# , , 1
#      [,1] [,2] [,3]
# [1,]  1.5  1.5  1.5
# [2,]  1.5  1.5  1.5
# , , 2
#      [,1] [,2] [,3]
# [1,]  2.5  2.5  2.5
# [2,]  2.5  2.5  2.5
# , , 3
#      [,1] [,2] [,3]
# [1,]  3.5  3.5  3.5
# [2,]  3.5  3.5  3.5

apply的问题是它可以进行维度的隐式转置,但plyr包中的aaply类似,但没有隐式转转置。

library(plyr)
library(zoo)
aaply(b, 1:2, rollmean, 2)

给予:

X2
X1    1   2   3
1 1.5 1.5 1.5
2 1.5 1.5 1.5
, ,  = 2
X2
X1    1   2   3
1 2.5 2.5 2.5
2 2.5 2.5 2.5
, ,  = 3
X2
X1    1   2   3
1 3.5 3.5 3.5
2 3.5 3.5 3.5

最新更新