2012-09-25 4 views
10

auszuschließen Ich versuche, den Mittelwert jeder Zeile in meinem Datenrahmen zu berechnen. In jeder Zeile sind Nullen und ich möchte diese aus der Berechnung ausschließen. Ich möchte nicht die gesamte Zeile entfernen, sondern nur die Nullen und den Mittelwert der verbleibenden Werte in jeder Zeile berechnen. Wenn die Zeile alle Nullwerte enthält, sollte das Ergebnis Null sein.Wie kann ich die Mittel von Zeilen berechnen, während die Nullwerte aus Zeilen im Datenrahmen

Antwort

17

Wie wäre es

nzmean <- function(x) { 
    if (all(x==0)) 0 else mean(x[x!=0]) 
} 
apply(mydata,1,nzmean) 

?

Es fällt mir ein, dass es geringfügig schneller zu tun

nzmean <- function(x) { 
    zvals <- x==0 
    if (all(zvals)) 0 else mean(x[!zvals]) 
} 

d versuchen könnte tun den Vergleich von x mit Null zweimal zu vermeiden.

+0

+1 Snap. Ich lösche meine Antwort. – Andrie

+0

@Ben Bolker Danke für die Hilfe .. – Gongon

+0

wenn es Ihre Frage beantwortet, können Sie auf das Häkchen klicken, um die Antwort zu akzeptieren ... –

11

Oder was Sie tun könnten, ist NA zu Null zuweisen, was effektiv ist, was Sie tun möchten. Einige Beispieldaten:

spam = matrix(runif(100), 10, 10) 
spam[1,2] = 0 
spam[4,3] = 0 
spam[10,] = 0 
spam[spam == 0] <- NA 

und rowMeans verwenden, die ifelse ist für Zeilen zu überprüfen, die vollständig NA sind. Das Argument na.rm ist hier wichtig:

mean_values = rowMeans(spam, na.rm = TRUE) 
mean_values = ifelse(is.na(mean_values), 0, mean_values) 
+2

das ist wahrscheinlich (?) Schneller als meine Lösung für sehr große Datensätze. –

+1

Ich mag auch NA konzeptionell verwenden, macht es klar, 0 ist keine gültige Nummer. –

Verwandte Themen