【问题标题】:how to use aaply and retain order of dimensions in array?如何使用 aaply 并保留数组中的维度顺序?
【发布时间】:2014-07-26 06:44:21
【问题描述】:

我有一个 3 维数组。我想将一个函数应用于第三维并返回一个数组。我很高兴 plyr::aaply 几乎可以满足我的要求。然而,它交换了我的数组的尺寸。文档告诉我它是幂等的,这(在我查找之后)让我认为结构应该保持不变。这是一个具有标识功能的可重现示例。我可以修改它以保留数组维度的顺序吗?

nRow <- 10
nCol <- 10
nAge <- 7

#creating the array
dimnames <- list(NULL,NULL,NULL)
names(dimnames) <- c("x","y","age")
aF <- array(0, dim=c(nCol,nRow,nAge), dimnames=dimnames)

#aaply the identity function to the 3rd dimension
aTst <- aaply(aF, .margins=3, identity )

dim(aF)
#[1] 10 10  7
dim(aTst)
#[1]  7 10 10

查看尺寸已从 10,10,7 更改为 7,10,10。我知道它可以使用 aperm 改回来,但如果我能避免它会很好。

aTst2 <- aperm(aTst, c(2, 3, 1))

这里有一些关于我实际尝试做的事情的更多细节(感谢@Simon O'Hanlon)。 x & y 代表二维空间,我在网格上的每个单元格都有一个年龄向量。我想移动每个年龄段,使用这个功能:

rtMove1 <- function(m, pMove=0.4) {

  #create matrices of the 4 neighbour cells to each cell
  mW = cbind( rep(0,nrow(m)), m[,-nrow(m)] )
  mN = rbind( rep(0,ncol(m)), m[-ncol(m),] )
  mE = cbind( m[,-1], rep(0,nrow(m)) )
  mS = rbind( m[-1,], rep(0,ncol(m)) )

  mArrivers <- pMove*(mN + mE + mS + mW)/4
  mStayers <- (1-pMove)*m

  mNew <- mArrivers + mStayers
  return( mNew )
}

要启动 popn,请在我可以执行此操作的所有单元格中移动所有年龄。

#initiate 100 individuals of age 3 at 5,5
aF[5,5,3] <- 100

aTst <- aaply(aF, .margins=3, rtMove1 )

aTst[3,,]

这适用于重新分配 popn :

     1 2 3  4  5  6 7 8 9 10
  1  0 0 0  0  0  0 0 0 0  0
  2  0 0 0  0  0  0 0 0 0  0
  3  0 0 0  0  0  0 0 0 0  0
  4  0 0 0  0 10  0 0 0 0  0
  5  0 0 0 10 60 10 0 0 0  0
  6  0 0 0  0 10  0 0 0 0  0
  7  0 0 0  0  0  0 0 0 0  0
  8  0 0 0  0  0  0 0 0 0  0
  9  0 0 0  0  0  0 0 0 0  0
  10 0 0 0  0  0  0 0 0 0  0

但如果我想重复,我需要使用 aperm 重新排列尺寸。

谢谢, 安迪

【问题讨论】:

  • 幂等意味着它与后续调用保持相同:即 f^n(x) = f(x)。
  • 你真正想应用什么函数?您是否知道base::apply 函数可以对数组的任意维度进行操作? apply( aF , 1:3 , identity ) 或例如apply( aF , 3 , sum ) 为您提供跨第 3 维的每个 2D 矩阵的总和(在本例中为 7 个 0s 的向量)。

标签: arrays r plyr


【解决方案1】:

你可以试试

aTst <- aaply(aF, c(1,2,3), identity)

这应该可以解决问题

【讨论】:

  • 这将返回列表...@Andy - 需要数组作为回报,他明确提到。
猜你喜欢
  • 2023-03-13
  • 2016-05-14
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
  • 2020-06-28
  • 1970-01-01
  • 2014-12-27
  • 1970-01-01
相关资源
最近更新 更多