2012-03-28 2 views
1

У меня небольшая проблема с операциями с вектором или массивом.R - Vector/Array Дополнение

У меня есть три 3D-массива, и я хочу найти их среднее. Как я могу это сделать? мы не можем использовать mean(), так как он возвращает только одно значение.

Важнее некоторые из ячеек в массивах NA whic значит, если я просто добавить их как

A = (B + C + D)/3 

результатам покажет НС, а также.

Как я могу позволить ему распознать, является ли ячейка NA, а затем просто пропустить ее.

Как

A = c(NA, 10, 15, 15, NA) 
B = c(10, 15, NA, 22, NA) 
C = c(NA, NA, 20, 26, NA) 

Я хочу выход среднем эти векторы быть

(10, (10+15)/2, (15+20)/2, (15+22+26)/3, NA) 

Мы также не можем использовать na.omit, потому что он будет двигаться порядок индексов.

Это - соответствующий код. Я бы хотел, чтобы это было полезно.

for (yr in 1950:2011) { 
    temp_JFM <- sst5_sst2[,,year5_sst2==yr & (month5_sst2>=1 & month5_sst2<=3)] 
     k = 0 
     jfm=4*k+1 
    for (i in 1:72) { 
     for (j in 1:36) { 
      iposst5_sst2[i,j,jfm] <- (temp_JFM[i,j,1]+temp_JFM[i,j,2]+temp_JFM[i,j,3])/3 
     } 
    }  
} 

Thnk you.

Это уже разрешено.

Самый простой способ исправить это можно показать ниже.

iposst5_sst2[i,j,jfm] <- mean(temp_JFM[i,j,],na.rm=TRUE) 

ответ

2

Вот пример, который делает вектор из трех значений, что делает na.omit использовать:

vectorAverage <- function(A,B,C) { 
    Z <- rep(NA, length(A)) 

    for (i in 1:length(A)) { 
     x <- na.omit(c(A[i],B[i],C[i])) 
     if (length(x) > 0) Z[i] = mean(x) 
    } 
    Z 
} 

Итоговое в:

vectorAverage(A,B,C) 
[1] 10.0 12.5 17.5 21.0 NA 

Отредактировано: Пропущено NaN на выходе первой версии.

7

Я не совсем уверен, что ваш желаемый выход, но я предполагаю, что вы действительно хотите, чтобы построить это не три 3D массивы, но один массив 4D, который вы можете использовать apply на.

Что-то вроде этого:

#Three 3D arrays... 
A <- array(runif(1:27),dim = c(3,3,3)) 
B <- array(runif(1:27),dim = c(3,3,3)) 
C <- array(runif(1:27),dim = c(3,3,3)) 

#Become one 4D array 
D <- array(c(A,B,C),dim = c(3,3,3,3)) 

#Now we can simply apply the function mean 
# and use it's na.rm = TRUE argument. 
apply(D,1:3,mean,na.rm = TRUE) 
+3

+1 - также, намного быстрее, чем 'apply', если вы работаете с большими массивами, вы можете сделать' rowMeans (D, na.rm = TRUE, dims = 3) ' – flodel

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