2012-09-25 14 views

Respuesta

17

¿Qué tal

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

?

Se me ocurre que podría ser marginalmente más rápida de hacer

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

es decir, tratar de evitar hacer la comparación de x con cero dos veces.

+0

+1 Ajustar. Eliminaré mi respuesta. – Andrie

+0

@Ben Bolker Gracias por la ayuda .. – Gongon

+0

si responde su pregunta, puede hacer clic en la marca de verificación para aceptar la respuesta ... –

11

O lo que podría hacer es asignar NA a cero, que es efectivamente lo que quiere hacer. Algunos datos de la muestra:

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

y utilizar rowMeans, la ifelse es para comprobar si hay filas que son totalmente NA. El argumento na.rm es importante aquí:

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

esto es probablemente (?) Más rápido que mi solución para conjuntos de datos muy grandes. –

+1

También me gusta usar NA conceptualmente, deja en claro que 0 no es un número válido. –

Cuestiones relacionadas