【发布时间】: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 的向量)。