我有一个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
但如果我想重复,我需要使用精子重新排列尺寸。
谢谢, 安迪
答案 0 :(得分:-1)
你可以尝试
aTst <- aaply(aF, c(1,2,3), identity)
应该做的伎俩