微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

rollapply 二维数组 (R)

如何解决rollapply 二维数组 (R)

我想做一些我认为使用 rollapply 应该很​​容易实现的事情,但我遇到了一些麻烦。

对于简单的向量,我们有

> a <- c(1:10)
> a
 [1]  1  2  3  4  5  6  7  8  9 10
> rollapply(a,2,mean)
 [1] 1.5 2.5 3.5 4.5 5.5 6.5 7.5 8.5 9.5

这是应该的。但是对于更高的维度会出现问题

> b <- array(c(1:6),c(2,3))
> b
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
> rollapply(b,mean)
     [,]  1.5  3.5  5.5

如果我想要应用于列,这很好 - 但肯定也必须有某种方法可以应用于行并获得

     [,2]
[1,]    2    4
[2,]    3    5

在我看来,rollapply 函数无法做到这一点。

解决方法

您可以简单地转置矩阵,然后将其转回:

t(rollapply(t(b),2,mean))
     [,1] [,2]
[1,]    2    4
[2,]    3    5
,

我们可以简单地使用 applyMARGIN = 1 来遍历行并应用 rollapplyMARGIN 也可以针对更高的维度进行调整,即它是更通用的解决方案

t(apply(b,1,function(x) rollapply(x,mean)))

-输出

#      [,2]
#[1,]    2    4
#[2,]    3    5

或者使用 dapply 中的 collapse

library(collapse)
dapply(b,FUN = function(x) rollapply(x,fmean),MARGIN = 1)
,

基本的 R 选项

> do.call(`+`,lapply(c(1,ncol(b)),function(k) b[,-k])) / 2
     [,]    3    5

跟进

如果您想使用基本 R 实现并扩展到一般情况,即超过 2 个,那么您可以尝试下面的代码,其中定义了一个函数 f

f <- function(b,m) {
  apply(
    simplify2array(
      lapply(
        data.frame(t(embed(seq(ncol(b)),m))[m:1,]),k]
      )
    ),1:2,mean
  )
}

你会看到

> f(array(c(1:6),c(2,3)),2)
     [,]    3    5

> f(array(c(1:12),6)),4)
     [,2] [,3] [,4]
[1,]    3    5    7    9
[2,]    4    6    8   10

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?