2015-08-13

Analizar subgrupos de un data frame con la función aggregate en R

Title

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

Nube de datos