如何使用aaply并保留数组中的维度顺序?

时间:2014-06-05 10:12:03

标签: arrays r plyr

我有一个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。我知道它可以用精子改回来,但是如果我能避免它就会好的。

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

这里有一些关于我实际上正在尝试做什么的更多细节(感谢@Simon O&#39; Hanlon)。 x&amp; y代表2D空间,我在网格上的每个单元格都有一个年龄向量。我想使用此功能移动每个年龄组:

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 )
}

要启动弹出窗口,请移动所有单元格中的所有年龄段,我可以执行此操作。

#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

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

谢谢, 安迪

1 个答案:

答案 0 :(得分:-1)

你可以尝试

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

应该做的伎俩