2012-03-28 14 views
1

Ich habe ein wenig Probleme mit Vektor-oder Array-Operationen.R - Vector/Array Addition

Ich habe drei 3D-Arrays und ich möchte den Durchschnitt von ihnen finden. Wie kann ich das machen? wir können mean() nicht verwenden, da es nur einen einzelnen Wert zurückgibt.

Umso wichtiger ist, einige der Zellen in den Arrays NA whic bedeuten sind, wenn ich sie so wie

hinzufügen
A = (B + C + D)/3 

Die Ergebnisse werden auch zeigen, NA.

Wie kann ich es erkennen lassen, wenn die Zelle NA ist, dann überspringen Sie es einfach.

Wie

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

Ich möchte die Ausgabe von durchschnittlich diese Vektoren sein

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

Wir auch nicht na.omit verwenden können, weil sie die Reihenfolge der Indizes bewegen wird.

Dies ist der entsprechende Code. Ich wünschte, es wäre hilfreich.

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 Sie.

Es wurde bereits gelöst.

Der einfachste Weg, um es zu korrigieren, kann unten gezeigt werden.

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

Antwort

2

Hier ist ein Beispiel, die einen Vektor der drei Werte macht, die na.omit nutzbar macht:

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 
} 

in Resultierende:

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

Bearbeitet: Verpasste das NaN in der Ausgabe der ersten Version.

7

Ich bin nicht ganz sicher, was Ihre gewünschte Ausgabe ist, aber ich vermute, dass das, was Sie wirklich wollen, bauen nicht drei 3D-Arrays ist, sondern ein 4D-Array, das Sie dann apply auf verwenden können.

Etwas wie folgt aus:

#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 - auch, viel schneller als 'apply', wenn Sie mit großen Arrays arbeiten, können Sie' rowMeans (D, na.rm = TRUE, Dims = 3) ' – flodel