如何将两个数组送入apply

时间:2015-08-25 23:20:27

标签: r

我有两个三维数组,我想计算一些它们的统计数据。只要我只使用一个变量,我就知道该怎么做。例如,要计算第一维的平均值,我使用以下内容:

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来处理这种情况。非常感谢任何帮助。 谢谢,

1 个答案:

答案 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),因此需要反转索引以使矩阵符合您的问题。