2015-08-25 4 views
0

У меня есть два трехмерных массива, и я хочу рассчитать некоторую статистику по ним. Пока я работаю только с одной переменной, я знаю, как это сделать. Например, чтобы вычислить среднее по первой размерности, я использую следующее:Как подать два массива в заявку

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.Any бы очень признателен. Спасибо,

+1

Похоже, это может быть задача для 'mapply()' –

+0

Вы знаете, как перефразировать это в mapply? – newbie

+0

Просто посмотрев на это, я могу дать 'f <- function (i, j) cor (obs [, i, j], mod [, i, j], method =" pearson "); mapply (f, 1: dim (obs) [2], 1: dim (obs) [3]) - выстрел. Но было бы лучше, если бы вы могли создать небольшой воспроизводимый пример с желаемым результатом. –

ответ

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 в петлях), так что индексы должны были бы быть отменены, чтобы иметь матрицу в упорядоченности вашего вопроса.

+0

Или вы можете использовать 'external' и' Vectorize' – akrun

+0

$ Решение nongkrong - это хорошо, я должен сделать дополнительный шаг, преобразовывая вектор в конец в требуемую матрицу. Спасибо, – newbie

+0

, если я подменю применить с plyr :: aaply, то преобразование в матрицу будет обрабатываться автоматически. Просто для разъяснения. – newbie

Смежные вопросы