2012-03-28 212 views
1

我有一個向量或數組操作有點麻煩。R - 矢量/陣列加法

我有三個3D陣列,我想找到它們的平均值。我怎樣才能做到這一點?我們不能使用mean(),因爲它只返回一個值。

更重要的是一些在陣列中的細胞是NA whic意思是,如果我只是將它們添加像

A = (B + C + D)/3 

的結果將顯示NA爲好。

我該如何讓它識別單元格是否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 
     } 
    }  
} 

那你呢。

它已經被解決了。

糾正它的最簡單方法如下所示。

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陣列,而是一個四維陣列,然後可以上使用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 - 同樣的,如果你正在處理大數組,你可以使用'applyMe'快得多'rowMeans(D,na.rm = TRUE,dims = 3)' – flodel 2012-03-28 03:56:31