2011-09-16 17 views

Respuesta

9

Saltar a la mitad de la sección de ejemplos de help(aggregate) y verá esto:

## Formulas, one ~ one, one ~ many, many ~ one, and many ~ many: 
aggregate(weight ~ feed, data = chickwts, mean) 
aggregate(breaks ~ wool + tension, data = warpbreaks, mean) 
aggregate(cbind(Ozone, Temp) ~ Month, data = airquality, mean) 
aggregate(cbind(ncases, ncontrols) ~ alcgp + tobgp, data = esoph, sum) 

cuatro llamadas diferentes a aggregate(), todo ello utilizando la interfaz defórmula. La forma en que está escrito más arriba en lo que usted cita tiene que ver con el mecanismo de despacho método utilizado a lo largo R.

Considere el primer ejemplo:

R> class(weight ~ feed) 
[1] "formula" 
R> class(chickwts) 
[1] "data.frame" 

despachos de manera agregada en él primer argumento (de la clase formula). La forma en que se resuelve una fórmula en R normalmente gira en torno a model.matrix, presumo que algo similar sucede aquí y una llamada equivalente es eventualmente ejecutada por aggregate.data.frame, usando el segundo argumento chickwts, data.frame.

R> aggregate(weight ~ feed, data = chickwts, mean) 
     feed weight 
1 casein 323.583 
2 horsebean 160.200 
3 linseed 218.750 
4 meatmeal 276.909 
5 soybean 246.429 
6 sunflower 328.917 
R> 

Lo que ha solicitado no es la pregunta más fácil para principiantes, me gustaría recomendar un buen vistazo a fondo en algunos de los documentos y un libro R decente si usted tiene uno a mano. (Y otros SO preguntas prestar a las recomendaciones en cuanto a qué leer a continuación.)

Editar: tuve que cavar un poco como aggregate.formula() no se exporte desde stats espacio de nombres, pero se puede ver en él escribiendo stats:::aggregate.formula en el indicador - que a su vez muestra claramente que lo hace, de hecho, el envío a aggregate.data.frame():

[.... some code omitted ...] 
    if (is.matrix(mf[[1L]])) { 
     lhs <- as.data.frame(mf[[1L]]) 
     names(lhs) <- as.character(m[[2L]][[2L]])[-1L] 
     aggregate.data.frame(lhs, mf[-1L], FUN = FUN, ...) 
    } 
    else aggregate.data.frame(mf[1L], mf[-1L], FUN = FUN, ...) 
} 
<environment: namespace:stats> 
R> 
+4

¿hay una manera de hacer esto sin nombrar todas las columnas en 'cbind()'? Para columnas múltiples, supongo que no entiendo por qué no se puede hacer 'aggregate (. ~ Var, ...)' o nombres <- c ("var1", "var2", ...) 'y luego 'aggregate (df [, names] ~ var, ...)'. ¿O esto simplemente no es posible? – Hendy

Cuestiones relacionadas