R中的多维数组乘法

mzu*_*uba 5 r multidimensional-array

我想执行一些复杂的多维数组乘法,其中我乘以数组的特定边距.

考虑这个例子,我在群体的某些边缘流行分组特征(A和B):

# setup data

random=runif(4)

group.prevalence <- aperm (array(c(random,1-random),
                  dim=c(2,2,2), 
                  dimnames=list(age=c("young","old"),
                                gender=c("male","female"),
                                group=c("A","B"))) , c(3,1,2) )

group.prevalence 
# A + B = 1
Run Code Online (Sandbox Code Playgroud)

假设我现在有一群兴趣...

population <- round(array(runif(4, min=100,max=200) %o% c(1,1*(1+random[1]),1*(1+random[1])^2), 
                          dim=c(2,2,3), dimnames=list(age=c("young","old"),
                                                      gender=c("male","female"),
                                                      year=c("year1","year2","year3"))))

population
Run Code Online (Sandbox Code Playgroud)

...我想计算"A"和"B"的流行程度.

糟糕的解决方案是在循环中填充所有内容:

# bad solution
grouped.population <- array(NA, dim=c(2,2,2,3), 
                            dimnames=list(group=c("A","B"),
                                          age=c("young","old"),
                                          gender=c("male","female"),
                                          year=c("year1","year2","year3")))

for (group in c("A","B"))
  for(gender in c("male","female"))
    for (age in c("young","old")) 
      grouped.population[group,age,gender,] <- group.prevalence[group,age,gender] * population[age,gender,]
Run Code Online (Sandbox Code Playgroud)

但我认为某种应用可能派上用场,可能是plyr的aaply,因为结果的尺寸应该保留.我试过了:

library(plyr)
aaply(population, c(1,2), function(x) x * group.prevalence)
# too many dimensions
Run Code Online (Sandbox Code Playgroud)

我欢迎任何建议.