Tabyl

Los analistas cuentan mucho. De hecho, se ha dicho que “la ciencia de datos consiste principalmente en contar cosas”. Pero la función de base R para contar table(), deja mucho que desear:

  • No acepta entradas de data.frame (y por lo tanto no funciona bien con la %>% tubería)

  • No da salida a data.frames

  • Sus resultados son difíciles de formatear. Compare el aspecto y las opciones de formato de una tabla R con una tabla dinámica de Microsoft Excel o incluso con el formato de tabla proporcionado por SPSS.

tabyl() está alineado con tidyverse y se basa principalmente en los paquetes dplyr y tidyr.

Cómo funciona

En su superficie, tabyl() produce tablas de frecuencia utilizando 1, 2 o 3 variables. Debajo del capó, tabyl() también adjunta una copia de estos recuentos como un atributo del data.frame resultante.

El resultado parece un data.frame básico de recuentos, pero debido a que también tabyl contiene estos metadatos, puede usar adorn_funciones para agregar información adicional y un formato bonito.

Las adorn_funciones están diseñadas para funcionar tabyls, pero se han adaptado para trabajar con marcos de datos similares que no son tabyl que necesitan formateo.

## Warning: package 'readxl' was built under R version 4.0.4

TABYL UNIDIRECCIONAL

library(janitor)
## Warning: package 'janitor' was built under R version 4.0.4
## 
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
ues=FMUES_SMET %>%
  tabyl(ESCUELA)
ues
##              ESCUELA   n   percent
##       Administrativo 112 0.5333333
##  Escuela de Medicina  45 0.2142857
##                  ETM  53 0.2523810

Cuando NA hay valores presentes, tabyl() también muestra porcentajes “válidos”, es decir, con los valores faltantes eliminados del denominador. Y aunque tabyl() está diseñado para tomar un data.frame y nombres de columna, también puede producir un tabyl unidireccional llamándolo directamente en un vector:

x=c("pequeño","medio","medio","alto","alto","medio","NA")
tabyl(x)
##        x n   percent
##     alto 2 0.2857143
##    medio 3 0.4285714
##       NA 1 0.1428571
##  pequeño 1 0.1428571

La mayoría de las adorn_funciones auxiliares están diseñadas para tabyls bidireccionales, pero las que tienen sentido para un tabyl unidireccional funcionan:

ues %>%
  adorn_totals("row") %>%
  adorn_pct_formatting()
##              ESCUELA   n percent
##       Administrativo 112   53.3%
##  Escuela de Medicina  45   21.4%
##                  ETM  53   25.2%
##                Total 210  100.0%

TABYL BIDIRECCIONAL

Esto a menudo se denomina tabla de “tabla de referencias cruzadas” o de “contingencia”. Llamar tabyl a dos columnas de un data.frame produce el mismo resultado que la combinación común de dplyr::count(), seguido de tidyr::pivot_wider() una forma amplia:

t1 <- FMUES_SMET %>%
  tabyl(GENERO, HTA, show_na = FALSE)
t1
##     GENERO  No Si
##   Femenino 100  9
##  Masculino  77 23

Como es un tabyl, podemos mejorarlo con adorn_funciones auxiliares. Por ejemplo:

t1 %>%
  adorn_percentages("row") %>%
  adorn_pct_formatting(digits = 2) %>%
  adorn_ns()
##     GENERO           No          Si
##   Femenino 91.74% (100)  8.26%  (9)
##  Masculino 77.00%  (77) 23.00% (23)

Los adornos tienen opciones para controlar los ejes, el redondeo y otras opciones de formato relevantes (más sobre eso a continuación).

t2 <- FMUES_SMET %>%
  tabyl(ESCUELA, HTA, GENERO, show_na = FALSE)

# El resultado es un tabyl de ESCUELA x HTA, filtrado con una
#lista por GENERO
t2 
## $Femenino
##              ESCUELA No Si
##       Administrativo 42  6
##  Escuela de Medicina 25  1
##                  ETM 33  2
## 
## $Masculino
##              ESCUELA No Si
##       Administrativo 48 15
##  Escuela de Medicina 15  4
##                  ETM 14  4

Si las adorn_funciones auxiliares se llaman en una lista de data.frames, como la salida de una tabyl llamada de tres vías , llamarán purrr::map() para aplicarse a cada data.frame en la lista:

library(purrr)
## Warning: package 'purrr' was built under R version 4.0.4
FMUES_SMET %>%
  tabyl(ESCUELA, HTA, GENERO, show_na = FALSE) %>%
  adorn_totals("row") %>%
  adorn_percentages("all") %>%
  adorn_pct_formatting(digits = 1) %>%
  adorn_ns %>%
  adorn_title
## $Femenino
##                              HTA         
##              ESCUELA          No       Si
##       Administrativo 38.5%  (42) 5.5% (6)
##  Escuela de Medicina 22.9%  (25) 0.9% (1)
##                  ETM 30.3%  (33) 1.8% (2)
##                Total 91.7% (100) 8.3% (9)
## 
## $Masculino
##                             HTA           
##              ESCUELA         No         Si
##       Administrativo 48.0% (48) 15.0% (15)
##  Escuela de Medicina 15.0% (15)  4.0%  (4)
##                  ETM 14.0% (14)  4.0%  (4)
##                Total 77.0% (77) 23.0% (23)

La función adorn_

Estas funciones modulares se basan en una tabyl aproximación a la funcionalidad de una tabla dinámica en Microsoft Excel. Imprimen resultados elegantes para un análisis interactivo o para compartir en un informe, por ejemplo, con knitr::kable(). Por ejemplo:

FMUES_SMET %>%
  tabyl(GENERO, HTA,show_na = FALSE) %>%
  adorn_totals(c("row", "col")) %>%
  adorn_percentages("col") %>% 
  adorn_pct_formatting(rounding = "half up", digits = 0) %>%
  adorn_ns() %>%
  adorn_title("combined") %>%
  knitr::kable()
GENERO/HTA No Si Total
Femenino 56% (100) 28% (9) 52% (109)
Masculino 44% (77) 72% (23) 48% (100)
Total 100% (177) 100% (32) 100% (209)

Las funciones de adorno son:

  • adorn_totals(): Agregue los totales de fila, columna o ambas.

  • adorn_percentages(): Calcule porcentajes a lo largo de cualquiera de los ejes o en todo el tabyl.

  • adorn_pct_formatting(): Formatee las columnas de porcentaje, controle el número de dígitos que se mostrarán y si se agregará el % símbolo.

  • adorn_rounding(): Redondea un data.frame de números (generalmente el resultado de adorn_percentages), ya sea usando la round()función base R o usando el conserje round_half_up()para redondear todos los lazos ( gracias, StackOverflow ).

por ejemplo, redondee 10.5 hasta 11, consistente con el comportamiento de desempate de Excel.

Esto contrasta con redondeo 10,5 hasta 10 como en R de la base round(10.5).

  • adorn_rounding(): devuelve columnas de clase numeric, lo que permite graficar, ordenar, etc. Es un sustituto menos agresivo de adorn_pct_formatting(); estas dos funciones no deben llamarse juntas.

  • adorn_ns(): agrega N a un tabyl. Estos se pueden extraer de los recuentos subyacentes del tabyl, que se adjuntan al tabyl como metadatos, o pueden ser proporcionados por el usuario.

  • adorn_title(): agrega un título a un tabyl (u otro data.frame). Las opciones incluyen poner el título de la columna en una nueva fila encima del data.frame o combinar los títulos de la fila y la columna en el espacio del nombre del data.frame. Estos adornos deben llamarse en un orden lógico, por ejemplo, probablemente desee agregar totales antes de calcular los porcentajes. En general, llámelos en el orden en que aparecen arriba.

Flextable

El paquete flextable proporciona un marco para crear fácilmente tablas para informes y publicaciones. Las tablas se pueden incrustar en:

  • Documentos de R Markdown con soporte para documentos HTML, Word y PowerPoint.

  • Documentos de Microsoft Word o PowerPoint con paquete oficial.

  • Documentos PDF con paquete pagedown.

Las tablas generadas con flextable() no se llevan bien con las transparencias html (el paquete flextable va orientado sobre todo a que las tablas se reproduzcan bien en Word y no necesariamente en otros formatos, si bien el autor asegura que está trabajando en que flextable deje de tener estas limitaciones).

Para que una tabla construida con flextable se pueda reproducir en una presentación html es necesario que la tabla se procese en último lugar mediante la función htmltools_value() y que además el resultado sea asignado a un objeto, del modo siguiente:

Ejemplo

#install.packages(c("flextable", "janitor", "tidyverse"))
library(janitor)
library(flextable)
## Warning: package 'flextable' was built under R version 4.0.4
library(officer)
## Warning: package 'officer' was built under R version 4.0.4
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.0.4
## Warning: package 'ggplot2' was built under R version 4.0.4
## Warning: package 'tibble' was built under R version 4.0.4
## Warning: package 'tidyr' was built under R version 4.0.4
## Warning: package 'readr' was built under R version 4.0.4
## Warning: package 'dplyr' was built under R version 4.0.4
## Warning: package 'stringr' was built under R version 4.0.4
## Warning: package 'forcats' was built under R version 4.0.4

autofit(): ajusta los anchos y alturas con respecto a los anchos y alturas del texto.

Gráfico

FMUES_SMET %>% 
  tabyl(GENERO,HTA,show_na = FALSE) %>% 
  adorn_percentages("col") %>% 
  pivot_longer(cols =-1, names_to = "HTA", values_to = "proporcion") %>% 
  mutate(porcentaje=100*proporcion) %>% 
  mutate(GENERO=factor(GENERO)) %>% 
  ggplot(aes(x=HTA, y=porcentaje, fill=GENERO)) +
  geom_col(position = "dodge") +
  geom_text(aes(label=sprintf("%.2f%%",porcentaje)), 
            position=position_dodge(width=0.9),
            vjust=1.5, col="white", fontface="bold") +
  labs(fill="GENERO")

TABLA=FMUES_SMET %>% tabyl(GENERO,HTA,show_na = FALSE) %>%
  mutate(GENERO=factor(GENERO)) %>% 
  adorn_percentages("col") %>% 
  adorn_pct_formatting() %>%
  adorn_ns() %>% 
  flextable() %>% 
  fontsize(size = 14, part = "all") %>%
  autofit() %>% 
  htmltools_value() # Imprescindible para que se muestre en transparencias html

TABLA

Podemos hacer una tabla de regresión utilizando el paquete flextable()

lm(EDAD ~ GENERO+PESO, FMUES_SMET) %>%
  as_flextable()

Una prueba t

t.test(EDAD ~ GENERO, data = FMUES_SMET)%>%
  as_flextable()