2012-02-28 10 views
21

Me gustaría obtener el promedio de ciertas columnas para cada fila.¿Cómo puedo obtener el promedio (media) de las columnas seleccionadas

que tienen estos datos:

w=c(5,6,7,8) 
x=c(1,2,3,4) 
y=c(1,2,3) 
length(y)=4 
z=data.frame(w,x,y) 

que devuelve:

w x y 
1 5 1 1 
2 6 2 2 
3 7 3 3 
4 8 4 NA 

me gustaría obtener la media para ciertas columnas, no todos ellos. Mi problema es que hay muchas NA en mis datos. Así que si quería que la media de x e y, esto es lo que me gustaría volver:

w x y mean 
1 5 1 1 1 
2 6 2 2 2 
3 7 3 3 3 
4 8 4 NA 4 

supongo que podría hacer algo como z$mean=z$x+z$y/2 pero la última fila para Y es NA así que obviamente no quiero la NA a calcular y no debería dividir por dos. Intenté cumsum, pero eso devuelve NA cuando hay una sola NA en esa fila. Supongo que estoy buscando algo que agregue las columnas seleccionadas, ignore las NA, obtenga el número de columnas seleccionadas que no tienen NA y divida por ese número. Lo intenté y el promedio y estoy completamente perplejo.

ETA: ¿Hay alguna manera de agregar un peso a una columna específica?

Respuesta

31

Éstos son algunos ejemplos:

> z$mean <- rowMeans(subset(z, select = c(x, y)), na.rm = TRUE) 
> z 
    w x y mean 
1 5 1 1 1 
2 6 2 2 2 
3 7 3 3 3 
4 8 4 NA 4 

medio ponderado en

> z$y <- rev(z$y) 
> z 
    w x y mean 
1 5 1 NA 1 
2 6 2 3 2 
3 7 3 2 3 
4 8 4 1 4 
> 
> weight <- c(1, 2) # x * 1/3 + y * 2/3 
> z$wmean <- apply(subset(z, select = c(x, y)), 1, function(d) weighted.mean(d, weight, na.rm = TRUE)) 
> z 
    w x y mean wmean 
1 5 1 NA 1 1.000000 
2 6 2 3 2 2.666667 
3 7 3 2 3 2.333333 
4 8 4 1 4 2.000000 
+1

Gracias, esto es exactamente lo que estoy buscando. Realmente necesito estudiar este comando de aplicación mágica, parece que es una solución para todo. – thequerist

17

Trate de usar rowMeans:

z$mean=rowMeans(z[,c("x", "y")], na.rm=TRUE) 

    w x y mean 
1 5 1 1 1 
2 6 2 2 2 
3 7 3 3 3 
4 8 4 NA 4 
+0

+1 Gracias, normalmente uso Extracto, no puedo creer que no haya pensado en esto. Dio el cheque a kohske por incluir la solución a ponderada también. – thequerist

+0

@andrew ¿Cómo puedo obtener rowMeans de un rango de columna con algún nombre particular (por ejemplo, MGW.1, MGW.2, MGW.3 ... MGW.198) por lo que todas estas columnas tienen un nombre que comienza con MGW pero luego el número es diferente y no estoy seguro sobre el número exacto de tales columnas, podrían ser 196 en un caso y 198 en otro. Lo que quiero es algo como: 'data.frame (ID = DF [, 1: 4], MGW = rowMeans (DF [, MGW. * *)), HEL = rowMeans (DF [, HEL. *]))' It significa que las primeras 4 columnas no deben tocarse mientras que para el resto de las columnas tomará el promedio de todas las columnas en la categoría MGW. * y HEL. * – Newbie

+0

Para eso, recomendaría usar dplyr y tidyr, ya que dplyr le permite seleccionar columnas basadas en expresiones regulares. Consulte [esta pregunta] (https://stackoverflow.com/questions/33401788/dplyr-using-mutate-like-rowmeans) para obtener un ejemplo, o [esta esencia] (https://gist.github.com/andrewheiss/ dcd38268c65396e1f18de626e70cae47) para un ejemplo trabajado de esta pregunta. – Andrew

Cuestiones relacionadas