En una hoja de cálculo, las tablas dinámicas o pivot tables son
potentes herramientas para resumir los datos de diferentes maneras.
Podemos crear estas tablas utilizando las funciones
group_by
y summarize
del paquete dplyr.
Echemos un vistazo a nuestro informe, justo después de leer los datos, creamos una tabla de resumen con el número de ensayos y el rendimiento media de cada cultivar de nuestro conjunto de datos.
Podemos utilizar group_by()
para agrupar nuestros datos
por cultivar y summarize()
para calcular
el número de ensayos y el rendimiento_ajustado medio
para cada grupo.
cultivares %>%
group_by(Cultivar) %>%
summarise(cantidad = n(),
rendimiento_ajustado_medio = round(mean(Rendimiento_Ajustado, na.rm = TRUE), 2))
## # A tibble: 19 × 3
## Cultivar cantidad rendimiento_ajustado_medio
## <chr> <int> <dbl>
## 1 ACA 203 3 2309
## 2 ACA 203 CL 57 3089.
## 3 ACA 203 CL DM 3 3771.
## 4 ACA 211 CL 9 2870.
## 5 ACA 350 CL PLUS 18 3439.
## 6 ACA 769 1 3744
## 7 ACA 861 185 3004.
## 8 ACA 862 1 3483
## 9 ACA 862 HO 14 2673.
## 10 ACA 863 82 3022.
## 11 ACA 864 DM 31 3474.
## 12 ACA 865 12 3256.
## 13 ACA 866 HO 21 2846.
## 14 ACA 867 43 3394.
## 15 ACA 868 HO 15 3645.
## 16 ACA 876 1 1691
## 17 ACA 884 1 1654
## 18 ACA 885 1 1574
## 19 ACA 886 1 1588
La función n()
devuelve el número de casos y la función
mean
calcula la media o promedio. El parámetro
na.rm = TRUE
indica a la función que elimine los valores
faltantes (NA
) antes de realizar el cálculo.
Pregunta: ¿Qué pasa si no se utiliza
group_by()
antes desummarise()
? Probémoslo y discutamos lo que ocurre.
cultivares %>%
summarise(cantidad = n(),
rendimiento_ajustado_medio = round(mean(Rendimiento_Ajustado, na.rm = TRUE), 2))
## # A tibble: 1 × 2
## cantidad rendimiento_ajustado_medio
## <int> <dbl>
## 1 499 3094.
Así que si no agrupamos por el cultivar primero, obtendremos una sola estadística de resumen (n y media en este caso) para todo el conjunto de datos.
Ahora, queremos la media del rendimiento en toneladas y con dos
decimales. Podemos cambiar nuestra llamada a summarise()
para obtener ese cálculo.
cultivares %>%
group_by(Cultivar) %>%
summarise(cantidad = n(),
rendimiento_ajustado_medio = round(mean(Rendimiento_Ajustado/1000, na.rm = TRUE), 2))
## # A tibble: 19 × 3
## Cultivar cantidad rendimiento_ajustado_medio
## <chr> <int> <dbl>
## 1 ACA 203 3 2.31
## 2 ACA 203 CL 57 3.09
## 3 ACA 203 CL DM 3 3.77
## 4 ACA 211 CL 9 2.87
## 5 ACA 350 CL PLUS 18 3.44
## 6 ACA 769 1 3.74
## 7 ACA 861 185 3
## 8 ACA 862 1 3.48
## 9 ACA 862 HO 14 2.67
## 10 ACA 863 82 3.02
## 11 ACA 864 DM 31 3.47
## 12 ACA 865 12 3.26
## 13 ACA 866 HO 21 2.85
## 14 ACA 867 43 3.39
## 15 ACA 868 HO 15 3.65
## 16 ACA 876 1 1.69
## 17 ACA 884 1 1.65
## 18 ACA 885 1 1.57
## 19 ACA 886 1 1.59
Primero dividimos el rendimiento ajustado por 1000 para transformarlo
de kilogramos a toneladas y luego utilizamos la función
round()
para redondear a sólo dos decimales.
Ahora estamos en el punto en el que queremos guardar esta información resumida como una variable para poder utilizarla en posteriores análisis y formatos.
Así que vamos a añadir una asignación de variable a esa primera línea:
Para que nuestra tabla se vea mejor en un informe, tenemos que cambiar algunos de sus elementos. Por ejemplo, el nombre de las variables debe ser informativo para una persona (de momento son nombres útiles para una computadora), y podemos añadirle un título y cambiar la alineación de los números.
Podemos hacerlo con la función kable
.
resumen %>%
knitr::kable(col.names = c("Cultivar", "Cantidad", "Rendimiento Ajustado Medio"),
align = "lcc",
caption = "Resumen de los Cultivares en el dataset.")
Cultivar | Cantidad | Rendimiento Ajustado Medio |
---|---|---|
ACA 203 | 3 | 2.31 |
ACA 203 CL | 57 | 3.09 |
ACA 203 CL DM | 3 | 3.77 |
ACA 211 CL | 9 | 2.87 |
ACA 350 CL PLUS | 18 | 3.44 |
ACA 769 | 1 | 3.74 |
ACA 861 | 185 | 3.00 |
ACA 862 | 1 | 3.48 |
ACA 862 HO | 14 | 2.67 |
ACA 863 | 82 | 3.02 |
ACA 864 DM | 31 | 3.47 |
ACA 865 | 12 | 3.26 |
ACA 866 HO | 21 | 2.85 |
ACA 867 | 43 | 3.39 |
ACA 868 HO | 15 | 3.65 |
ACA 876 | 1 | 1.69 |
ACA 884 | 1 | 1.65 |
ACA 885 | 1 | 1.57 |
ACA 886 | 1 | 1.59 |
Podemos hacer mucho más con otras funciones (o “verbos”) de dplyr. Veamos algunos más.
Muchas veces querremos trabajar con información que se deriva de los
datos originales. Esto se suele hacer añadiendo una nueva columna. Lo
hacemos con la función mutate()
.
Podemos añadir una nueva variable (llamada prop
) que
represente la proporción de ensayos en cada localidad
con el uso de mutate()
.
cultivares %>%
group_by(Localidad) %>%
summarise(cantidad = n(),
rendimiento_ajustado_medio = round(mean(Rendimiento_Ajustado, na.rm = TRUE), 2)) %>%
mutate(prop = cantidad/nrow(cultivares))
## # A tibble: 58 × 4
## Localidad cantidad rendimiento_ajustado_medio prop
## <chr> <int> <dbl> <dbl>
## 1 Anguil 21 3156. 0.0421
## 2 Ascasubi 5 4996. 0.0100
## 3 Asturias 7 4216. 0.0140
## 4 Balcarce 59 2856. 0.118
## 5 Barrow 34 2665. 0.0681
## 6 Bellocq 31 3899. 0.0621
## 7 Bolívar 5 3931 0.0100
## 8 Bordenave 3 4624 0.00601
## 9 Bulnes 11 2980. 0.0220
## 10 Carhue 2 2879 0.00401
## # ℹ 48 more rows
En nuestro informe también realizamos un gráfico de un cultivar
específico. Para ello necesitamos mantener sólo los datos del cultivar
que queremos analizar. Utilizamos la función filter()
para
filtrar filas de un data.frame, esta función devuelve un nuevo
data.frame con sólo las filas que satisfacen algunas condiciones.
Podemos utilizar operadores lógicos (>
,
<
, >=
, <=
,
==
) para crear condiciones a partir de variables numéricas.
Estos operadores también son útiles para fechas y cadenas de texto. El
siguiente código aplica una condición (“que sea igual a”) para datos de
tipo texto (la columna especie).
## # A tibble: 185 × 21
## Cultivar Empresa Floracion_dias Altura_cm Densidad_sem Rendimiento
## <chr> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 ACA 861 ACA 62 181 66229 4571
## 2 ACA 861 ACA 68 129 53345 2598
## 3 ACA 861 ACA 74 149 54286 2902
## 4 ACA 861 ACA 73 156 42682 3097
## 5 ACA 861 ACA 61 155 44818 3316
## 6 ACA 861 ACA 68 NA 44193 4140
## 7 ACA 861 ACA 69 167 40001 4201
## 8 ACA 861 ACA 69 168 40650 3200
## 9 ACA 861 ACA 72 173 56260 3858
## 10 ACA 861 ACA 71 NA 52858 4464
## # ℹ 175 more rows
## # ℹ 15 more variables: Aceite_porcentaje <dbl>, Rendimiento_Ajustado <dbl>,
## # Campania <chr>, Localidad <chr>, Latitud <dbl>, Longitud <dbl>,
## # Ensayo <chr>, `Tipo Ensayo` <chr>, Epoca <chr>, Distancia_surcos <dbl>,
## # Tipo_Siembra <chr>, Densidad_siembra <dbl>, Fecha_Siembra <chr>,
## # Testigo <chr>, Visible <chr>
Actividad: Escribe el código necesario para filtrar todos los ensayos de la localidad Anguil.
Actividad: Ahora escribe el código para filtrar todos los cultivares con un rendimiento mayor a 5000 kg/ha.