如何解决rollapply 用于多维数组 (R)
不是 rollapply for two-dimensional arrays (R) 的副本,而是对其的详细说明 - 我实际想要做的比那个问题中描述的稍微复杂一些。我希望这个问题的任何答案都能轻松扩展到我的实际问题的解决方案,但不幸的是事实并非如此。
对于简单的向量,我们有
> a <- c(1:4)
> a
[1] 1 2 3 4
> rollapply(a,2,mean)
[1] 1.5 2.5 3.5
这是应该的。虽然 rollapply
本身仅限于一维向量,但几个非常有用的答案 such as this one by 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
[,] 2 2 2
[2,] 2 2 2,3
[,] 3 3 3
[2,] 3 3 3,4
[,] 4 4 4
[2,] 4 4 4
应该有一些方法可以在窗口大小为 2 的情况下采取手段来产生
,] 1.5 1.5 1.5
[2,] 1.5 1.5 1.5,] 2.5 2.5 2.5
[2,] 2.5 2.5 2.5,] 3.5 3.5 3.5
[2,] 3.5 3.5 3.5
但我不知道如何(显然在实际情况下,子数组不会只是在整个数组中重复相同的整数,而是包含实际数据)。
理想情况下,为了求平均值,我还希望能够为窗口中的各个子数组分配不同的权重,但我认为这只是定义要应用的自定义函数的问题。
(*) 也许有一个明显的方法,但我到的地方已经晚了,我找不到它。
解决方法
我无法让 zoo::rollapply
工作(作为外部调用,与其中一个评论中的内部使用不同),但是可以通过从外部控制输入向量来模仿其大部分行为({{1 }}) 和“窗口”(seq_len(dim(b)[3])[-1]
外部,[-1]
内部)。从那里开始,它只是一个数组的一个暗淡的平均值:
i-1:0
,
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。