martes, 13 de febrero de 2018

Tablas para documentos LaTeX y HTML

Producir tablas para LaTeX

Una de las cosas más pesadas de un informe o documento es escribir tablas de datos, fórmulas o elementos de todo tipo.

Si se trata de datos numéricos, es posible que los tengamos en algún tipo de hoja de cálculo. Otra posibilidad es que la tabla sea el resultado de un procedimiento estadístico y que sea el summary() o print() de alguna clase de objeto de R. En suma, supongamos que estamos trabajando con R y disponemos de una tabla de datos. ¿Como los traspasamos a un documento de forma elegante?

La respuesta es xtable() del paquete xtable. Este paquete proporciona las funciones para trasladar nuestra tabla de R a LaTeX (por defecto) o HTML.

Para escribir una tabla de forma elegante es recomendable seguir las siguientes normas:

  • Evitar las líneas verticales
  • Evitar las cajas en las celdas
  • Normalmente tres líneas horizontales son suficientes (dos en el encabezado y una al final de la tabla)
  • Evitar las líneas dobles horizontales
  • Dejar suficiente espacio entre filas
  • En caso de duda alinear a la izquierda

Para seguir estas indicaciones en LaTeX podemos utilizar el paquete booktabs que hay que incluir en el preámbulo del documento con la instrucción:

\usepackage(booktabs)

y su correspondiente parámetro en el print() de la xtable, como en el siguiente ejemplo:

library(xtable)
data(tli)
g <- glm(disadvg ~ ethnicty*grade, data = tli, family = binomial)
print(xtable(g), booktabs = TRUE)
## % latex table generated in R 3.4.3 by xtable 1.8-2 package
## % Wed Feb 14 17:16:51 2018
## \begin{table}[ht]
## \centering
## \begin{tabular}{rrrrr}
##   \toprule
##  & Estimate & Std. Error & z value & Pr($>$$|$z$|$) \\ 
##   \midrule
## (Intercept) & 3.1888 & 1.5966 & 2.00 & 0.0458 \\ 
##   ethnictyHISPANIC & -0.2848 & 2.4808 & -0.11 & 0.9086 \\ 
##   ethnictyOTHER & 212.1701 & 22122.7093 & 0.01 & 0.9923 \\ 
##   ethnictyWHITE & -8.8150 & 3.3355 & -2.64 & 0.0082 \\ 
##   grade & -0.5308 & 0.2892 & -1.84 & 0.0665 \\ 
##   ethnictyHISPANIC:grade & 0.2448 & 0.4357 & 0.56 & 0.5742 \\ 
##   ethnictyOTHER:grade & -32.6014 & 3393.4687 & -0.01 & 0.9923 \\ 
##   ethnictyWHITE:grade & 1.0171 & 0.5185 & 1.96 & 0.0498 \\ 
##    \bottomrule
## \end{tabular}
## \end{table}

En el código LaTeX generado vemos que las líneas horizontales \hline han sido sustituidas por \toprule, \midrule y \bottomrule.

Si lo creemos conveniente y para dar más espacio entre las filas podemos modificar el parámetro de LaTeX que controla precisamente ese ancho. En el documento .Rnw escrito en LaTeX haremos algo así:


\begingroup
\sf
\setlength{\tabcolsep}{10pt}      % Default value: 6pt
\renewcommand{\arraystretch}{1.3} % Default value: 1

print(xtable(g), booktabs = TRUE)

\endgroup

Como se puede ver en el código anterior, antes de generar la tabla con el print(), se hacen tres cambios. El primero es cambiar el tipo de letra a Sans Serif, el segundo cambiar la medida de separación entre las columnas y el tercero aumentar un 30% la separación entre las columnas.

Producir tablas para HTML

Para generar una tabla HTML la instrucción es:

print(xtable(g), type = "html")
Estimate Std. Error z value Pr(>|z|)
(Intercept) 3.1888 1.5966 2.00 0.0458
ethnictyHISPANIC -0.2848 2.4808 -0.11 0.9086
ethnictyOTHER 212.1701 22122.7093 0.01 0.9923
ethnictyWHITE -8.8150 3.3355 -2.64 0.0082
grade -0.5308 0.2892 -1.84 0.0665
ethnictyHISPANIC:grade 0.2448 0.4357 0.56 0.5742
ethnictyOTHER:grade -32.6014 3393.4687 -0.01 0.9923
ethnictyWHITE:grade 1.0171 0.5185 1.96 0.0498

Hay que recordar que es necesario el parámetro results = 'asis' en la cabezera del chunk.

Aunque en este caso resulta más elegante utilizar el paquete htmlTable que además tiene muchas más posibilidades.

library(htmlTable)
htmlTable(round(summary(g)$coef,4), align="rrrr",
          col.columns = rep(c("white","#E6E6F0"), times=2))

Además de los manuales de cada uno de los paquetes citados, creo que se puede aprender mucho en los siguientes documentos:

The xtable Gallery

How-to use htmlTable

No hay comentarios:

Publicar un comentario