Las librerías a ejecutar son:1
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(reshape2)
La mayor aportación realizada por MS Excel al mundo BI es, para mí, las tablas dinámicas. El problema en Excel aparece cuando tienes que calcular un número significativo de tablas dinámicas. La automatización que permite el lenguaje de R acude en nuestra ayuda. La pregunta clave es: ¿Es posible reproducir una tabla dinámica también en R? Pues claro. Aunque hay varias maneras de hacer esto, aquí haremos uso de las posibilidades que nos ofrece el paquete reshape2, cuyo autor es Hadley Wickam, creador de un ecosistema de paquetes que se ha dado en llamar Hadleyverse:
Usemos el dataset que viene en R y que se llama mtcars (un grupo de coches con sus características en las columnas)
Tiene la siguiente pinta:
head(mtcars,3)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
Aunque las variables cyl,vs,am,gear,carb son numéricas, realmente son variables categóricas (determinan la pertenencia a grupos). Por ejemplo, la variable am, es el tipo de transmisión (0=automatica, 1=manual). Digamos que quiero hacer una tabla dinámica de cyl (número de cilindros) en las filas y gear (número de marchas) y representar el peso medio de los vehículos (wt)
Podemos usar el comando dcast() del paquete reshape2 asignando el resultado a la variable de memoria peso_coches:
peso_coches<-dcast(mtcars,cyl~gear,mean,value.var="wt")
head(peso_coches)
## cyl 3 4 5
## 1 4 2.465000 2.378125 1.8265
## 2 6 3.337500 3.093750 2.7700
## 3 8 4.104083 NaN 3.3700
que es el formato de tabla dinámica con el que estamos familiarizados por nuestro uso habitual en Excel. Aparece un valor perdido (NaN) para los coches de 8 cilindros y 4 marchas. Esto se debe a que no hay ninguno con esas características en el dataset.
donde:
mtcars es la tabla de datos
cyl~gear es lo que se llama modo fórmula. A la izquierda la variable que va en las filas. A la derecha la variable que va en las columnas.
mean() es la función que se va a representar en los valores (realmente sería más correcto decir métrica o medida). En este caso, la media. Pero podría ser sum() para suma, median() para mediana, …
value.var es la variable que se va a representar en los valores (wt).
Así sería la tabla dinámica en Excel:
Tabla dinámica en Excel
Ah, pero en R no aparecen los totales por filas y por columnas. No problemo. Podemos añadir el parámetro margins=TRUE y arreglado.
peso_coches<-dcast(mtcars,cyl~gear,mean,value.var="wt",margins=TRUE)
head(peso_coches)
## cyl 3 4 5 (all)
## 1 4 2.465000 2.378125 1.8265 2.285727
## 2 6 3.337500 3.093750 2.7700 3.117143
## 3 8 4.104083 NaN 3.3700 3.999214
## 4 (all) 3.892600 2.616667 2.6326 3.217250
Y recuerda \(y=2x+3\)
Elaborado mediante Rmarkdown con R 3.3.1 el 03-10-2016