Problema
Deseamos calcular para varios grupos de un data frame diferentes indicadores. En nuestro ejemplo usaremos los datos de TootGrowth.
[,1] len numeric Tooth length
[,2] supp factor Supplement type (VC or OJ).
[,3] dose numeric Dose in milligrams/day
Calcularemos la media y la mediana de la longitud de los dientes (len) para cada uno de los suplementos (supp) de vitaminas (VC o OJ).
Solución
Empleamos la función aggregate.
aggregate(len ~ supp, data = ToothGrowth,
FUN = function(x) c(media =mean(x), mediana = median(x)))
Empleamos la estructura de fórmula y ~ x, donde y es la variable numérica de la que queremos el resultado y x es la variable por la que agruparemos.
Resultado
supp len.media len.mediana
1 OJ 20.66333 22.70000
2 VC 16.96333 16.50000
Más niveles de agrupación
Si deseamos añadir el nivel de agrupación por dosis (dose).
aggregate(len ~ supp + dose, data = ToothGrowth,
FUN = function(x) c(media =mean(x), mediana = median(x)))
supp dose len.media len.mediana
1 OJ 0.5 13.23 12.25
2 VC 0.5 7.98 7.15
3 OJ 1.0 22.70 23.45
4 VC 1.0 16.77 16.50
5 OJ 2.0 26.06 25.95
6 VC 2.0 26.14 25.95
Más variables numéricas
Utilizamos ahora el conjunto de datos iris.
aggregate(cbind(Sepal.Length, Sepal.Width) ~ Species, data = iris,
FUN = function(x) c(media =mean(x), mediana = median(x)))
Species Sepal.Length.media Sepal.Length.mediana Sepal.Width.media
1 setosa 5.006 5.000 3.428
2 versicolor 5.936 5.900 2.770
3 virginica 6.588 6.500 2.974
Sepal.Width.mediana
1 3.400
2 2.800
3 3.000
Es necesario emplear la función cbind, de lo contrario, nos sumará los resultados de las variables numéricas:
aggregate(Sepal.Length + Sepal.Width~ Species, data = iris,
FUN = function(x) c(media = mean(x), mediana = median(x)))
Species Sepal.Length + Sepal.Width.media Sepal.Length + Sepal.Width.mediana
1 setosa 8.434 8.450
2 versicolor 8.706 8.600
3 virginica 9.562 9.600
Entradas relacionadas
No hay comentarios:
Publicar un comentario