#install.packages(c('expss', 'tidyr', 'highcharter'))
[ Cuando algo va acabando y sus puertas se van cerrando, algo nuevo comienza y otras puertas se van abriendo ]
Hace tiempo que no escribía en el blog. En mi sitio web InvestigaOnline.com puedes ver muchas de las cosas que he estado haciendo este último año, tan difícil para todos.
En este post de esta nueva temporada os presento una combinación fácil para pasar de una tabla EXPSS (vignette / examples / excel y expss), ese paquete de tabulación que descubrí hace un año, y que no me canso de agradecer a Gregory Demin por su valiosa y desinteresada aportación al mundo del proceso de datos a un gráfico Highcharts pero en el entorno R y por tanto utilizando el paquete highcharteR de Joshua Kunst al que también debo reconocer su maravillosa aportación. El entorno a utilizar como siempre RStudio y/o también sólo R con alguna pequeña variación.
Para este ejercicio utilizaremos los paquetes:
Si no los tienes instalados, utiliza la instrucción :
Si ya los tienes instalados de otras veces, simplemente carga los paquetes al inicio de tu script
suppressMessages(library(expss, quietly = TRUE))
suppressMessages(library(tidyr, quietly = TRUE))
suppressMessages(library(highcharter, quietly = TRUE))
Veamos como sería el script. Usaremos uno de los ficheros típicos de ejemplo de R, el archivo mtcars
.
data(mtcars)
<- apply_labels(mtcars,
mtcars vs = "Engine", vs = c("V-engine" = 0, "Straight engine" = 1),
am = "Transmission", am = c("Automatic" = 0,"Manual"=1)
)
Puedes observar que hemos cargado el fichero mtcars y hemos etiquetado sólo las variables que vamos a utilizar. Si por ejmplo cargas un fichero SPSS con la instrucción read_spss
del paquete expss
ese fichero ya estaría etiquetado. Es posible que si estás muy habituado a trabajar con expss
pudieras optar por asignar el texto con var_lab()
y los códigos con val_lab()
. El resultado sería el mismo.
data(mtcars)
var_lab(mtcars$vs) <- "Engine"
val_lab(mtcars$vs) <- c("V-engine" = 0, "Straight engine" = 1)
var_lab(mtcars$am) <- "Transmission"
val_lab(mtcars$am) <- c("Automatic" = 0,"Manual" = 1)
Sea como fuere, las dos variables que nos interesan están etiquetadas ya.
Pasemos ahora a hacer la tabla, una tabla cruzada de frecuencias donde calcularemos el porcentaje de casos de cada perfil de transmision por pefil de ingeniería de motor. Al principio haremos la tabla completa, tal como la haríamos para ser publicada como tabla y luego la reharemos para ser aprovechada y hacer un gráfico directo con ella.
%>%
mtcars tab_cols(total(),vs) %>%
tab_cells(am) %>%
tab_stat_cpct() %>%
tab_pivot()
#Total | Engine | |||
---|---|---|---|---|
V-engine | Straight engine | |||
Transmission | ||||
Automatic | 59.4 | 66.7 | 50 | |
Manual | 40.6 | 33.3 | 50 | |
#Total cases | 32 | 18 | 14 |
Más simple la tabla, imposible. Esta tabla es bonita, lista para ser presentada, pero realmente lo que nos importa es el cuadrante de datos porcentuales 66.7, 50, 33.3 y 50%. Y por ello vamos a retocar esa tabla para dejar la información bruta.
%>%
mtcars tab_cols(vs) %>%
tab_cells(am) %>%
tab_stat_cpct(total_row_position = 'none') %>%
tab_pivot()
Engine | ||
---|---|---|
V-engine | Straight engine | |
Transmission | ||
Automatic | 66.7 | 50 |
Manual | 33.3 | 50 |
Hemos quitado los totales de columna y fila. Ya tenemos solo los datos, pero nos molestan todavía algunos datos. Vamos a mirar esta tabla en estructura, en formato bruto, transformándola en un dataframe. Queda así:
as.data.frame(mtcars %>%
tab_cols(vs) %>%
tab_cells(am) %>%
tab_stat_cpct(total_row_position = 'none') %>%
tab_pivot())
row_labels Engine|V-engine Engine|Straight engine
1 Transmission|Automatic 66.66667 50
2 Transmission|Manual 33.33333 50
Ummm …. no nos gustan, imagino, los textos de fila y los textos de columna; vienen bien para publicar la tabla, ya que como ves el |
se utiliza para separar y no repetir el texto extra de la variable. Así que vamos a utilizar algunas herramientas del paquete expss
. Usaremos dos trucos para mejorar la salida de cara a obtener una matriz simple de datos. El uso de '|'
como asignación de texto a las variables y el uso de unvr()
para eliminar cualquier vestigio de texto anterior de la misma. Mira el resultado.
<- mtcars %>%
tab tab_cols('|'=unvr(vs)) %>%
tab_cells('|'=unvr(am)) %>%
tab_stat_cpct(total_row_position = 'none') %>%
tab_pivot()
tab
V-engine | Straight engine | |
---|---|---|
Automatic | 66.7 | 50 |
Manual | 33.3 | 50 |
Ha mejorado la cosa, ¿no?. Ahora convirtamos esta tabla (que es un dataframe de tipo etable
) en un dataframe como el que necesitan los gráficos. Para eso usaremos una opción magnífica del paquete tidyr
denominada pivot_longer()
que nos creará nuestro fichero necesario para highcharteR
con una sola instrucción. Nóteses que hemos guardado la tabla en un objeto llamado tab
para no tener que repetirla nuevamente. Guardaremos esa transformación nuevamente en un objeto llamado df y que será nuestro dataframe final. Aprovechamos también para cambiar los textos que quiero salgan en el gráfico para x, y y las series con la función colnames()
.
<- as.data.frame(tab)
tab colnames(tab) <- c('am', 'transmission', 'pct') # cambia el nombre de las columnas
<- tab %>% pivot_longer(-am, names_to='transmission', values_to='pct')
df df
# A tibble: 4 × 3
am transmission pct
<chr> <chr> <dbl>
1 Automatic transmission 66.7
2 Automatic pct 50
3 Manual transmission 33.3
4 Manual pct 50
Fíjate, hemos conseguido tener lo que va a necesitar el gráfico. Un campo x (am
) que usaremos para categorizar, un campo group (transmission
) que usaremos para agrupar por series y un campo y (pct
) que contiene los datos a representar. Hagamos el gráfico.
hchart(df, 'column', hcaes(x=am, y=pct, group=transmission))
Como una muestra más, una vez tenemos los datos …
hchart(df, 'bar', hcaes(x=am, y=pct, group=transmission))
Y éste es el gráfico por defecto. En posteriores posts veremos como mejorar y aplicar todas las características que nos pueda ofrecer la api de Highcharts desde el paquete highcharter
.
Hacemos un resumen global en un sólo paso de todo, lo que sería necesario.
#hacemos la tabla
<- mtcars %>%
tab tab_cols('|'=unvr(vs)) %>%
tab_cells('|'=unvr(am)) %>%
tab_stat_cpct(total_row_position = 'none') %>%
tab_pivot()
#la convertimos en objeto dataframe
<- as.data.frame(tab)
tab
#asignamos nombres
colnames(tab) <- c('am', 'transmission', 'pct') # cambia el nombre de las variables
#convertimos el dataframe de la tabla al dataframe del gráfico
<- tab %>% pivot_longer(-am, names_to='transmission', values_to='pct')
df
#hacemos los dos gráficos
hchart(df, 'column', hcaes(x=am, y=pct, group=transmission))
hchart(df, 'bar', hcaes(x=am, y=pct, group=transmission))
Esto ha sido todo, hasta el próximo post …