2012-01-25 27 views

Respuesta

16

Uso aggregate:

xtabs(hp~cyl+gear,aggregate(hp~cyl+gear,mtcars,mean)) 
    gear 
cyl  3  4  5 
    4 97.0000 76.0000 102.0000 
    6 107.5000 116.5000 175.0000 
    8 194.1667 0.0000 299.5000 
+0

¡Perfecto! Y una solución bastante elegante, debo agregar. ¡Gracias! –

5

Tener un vistazo al paquete plyr, específicamente ddply

ddply(dataframe, .(year), summarise, mean(age)) 

Si usted tiene que utilizar xtabs ... ver la respuesta anterior.

+0

Gracias por mostrarme otra solución muy elegante, pero dado que mi problema actual involucra tres variables, todavía estoy apuñalando. :) –

+2

puede continuar enumerando las variables en ddply y 'ddply (dataframe,. (Año), summarize, mean (age), max (height), sd (weight), etc ...)' – Justin

5

Me complace que la solución xtabs funcione para usted. Debo tener un paquete cargado que lo interfiere (y da un error). Otra solución sería:

tapply(dfrm$age, dfrm$year, FUN=mean) 

Para obtener dimensiones adicionales a la tabla (matriz) simplemente seguir añadiendo factores adicionales al segundo argumento de índice en forma list(fac1, fac2, fac3).

Aplicado al ejemplo utilizando mtcars:

tapply(mtcars$hp, list(mtcars$cyl,mtcars$gear), mean) 
     3  4  5 
4 97.0000 76.0 102.0 
6 107.5000 116.5 175.0 
8 194.1667 NA 299.5 

O incluso de forma más compacta:

with(mtcars, tapply(hp, list(cyl, gear), mean)) 
0

Otra solución es utilizar 2 funciones xtabs, primero para calcular la suma de las edades, segundo uno para obtener el recuento de cada grupo, luego obtener el promedio por suma/recuento.

por ejemplo, xtabs (edad ~ años, trama de datos)/(~ xtabs año trama de datos)

Sin embargo, el enfoque agregado se pueden utilizar para calcular la mediana u otras funciones aplicadas a la trama de datos. Definitivamente más flexible.

Cuestiones relacionadas