我有一个 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 代表 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 )
}
要启动 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 重新排列尺寸。
谢谢,
安迪