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)
我欢迎任何建议.