我有两个三维数组,我想计算一些它们的统计数据。只要我只使用一个变量,我就知道该怎么做。例如,要计算第一维的平均值,我使用以下内容:
obs<-array(1:8,c(2,2,2));
mod<-array(9:2,c(2,2,2));
meanObs <- apply(obs,c(2,3),mean) # mean of observation
meanMod <- apply(mod,c(2,3),mean) # mean od model simulation/forecast
但是,我不知道如何将两个切片阵列送入申请。例如,我试图计算第一维上的相关系数。我可以使用以下循环函数来完成它:
pearsonCor<-matrix(, nrow = dim(obs)[2], ncol = dim(obs)[3])
for (i in 1:dim(obs)[2]){
for (j in 1:dim(obs)[3]){
pearsonCor[i,j]<-tryCatch(suppressWarnings(cor(obs[,i,j], mod[,i,j], method = "pearson")),
error=function(cond) {return(NA)})
}
}
结果:
> pearsonCor
[,1] [,2]
[1,] -1 -1
[2,] -1 -1
但我想学习如何用apply来处理这种情况。非常感谢任何帮助。 谢谢,
答案 0 :(得分:1)
您可以使用expand.grid
来获取嵌套for
循环中的索引组合。然后apply
超过data.frame
个索引。
pearsonCor[] <- apply(expand.grid(1:dim(obs)[2], 1:dim(obs)[3]), 1, function(x)
cor(obs[,x[[1]], x[[2]]], mod[,x[[1]], x[[2]]]))
这实际上会更快地循环第一个变量(对应于循环中的i
),因此需要反转索引以使矩阵符合您的问题。