2012-02-16 16 views
5

Estoy generando una gran cantidad de tablas de contingencia ftable() para un informe descriptivo. Ejemplo:Colorize/highlight values ​​de R tableable() salida en knitr/Sweave rapports

   AUS BEL BUL EST FRA GEO GER HUN ITA NET NOR ROM RUS 

30- primary 0.06 0.03 0.07 0.03 0.02 0.03 0.03 0.02 0.05 0.03 0.05 0.04 0.02 
    secondary 0.30 0.09 0.16 0.10 0.10 0.14 0.10 0.16 0.11 0.08 0.08 0.09 0.11 
    tertiary 0.05 0.07 0.04 0.05 0.07 0.06 0.02 0.04 0.02 0.05 0.06 0.02 0.09 
30+ primary 0.07 0.16 0.12 0.07 0.16 0.03 0.05 0.11 0.35 0.21 0.09 0.17 0.03 
    secondary 0.40 0.20 0.30 0.29 0.25 0.35 0.35 0.34 0.27 0.20 0.27 0.34 0.26 
    tertiary 0.13 0.23 0.13 0.18 0.17 0.17 0.18 0.09 0.09 0.23 0.23 0.06 0.24 
60+ primary 0.00 0.12 0.10 0.13 0.14 0.07 0.05 0.12 0.09 0.11 0.06 0.19 0.12 
    secondary 0.00 0.05 0.05 0.08 0.06 0.10 0.14 0.09 0.02 0.04 0.11 0.07 0.06 
    tertiary 0.00 0.05 0.03 0.06 0.03 0.04 0.07 0.03 0.01 0.05 0.06 0.02 0.07 

estoy en busca de una función que podría tomar la salida ftable() o table(), y los valores Highligh que se desvían de la fila-media, o asignar un gradiente general al texto de los valores, por ejemplo, del 0-100% los valores se colorean de rojo a verde.

La salida ahora se procesa a través de knitr, pero no estoy seguro de en qué punto de la cadena de herramientas podría intervenir y agregar colores en función del tamaño relativo de los valores.

+0

También puede publicar esta pregunta en el sitio de intercambio de TeX/LaTeX si no obtiene buenas respuestas aquí. –

Respuesta

5

Puede usar la función latex, en el paquete Hmisc.

# Example shamelessly copied from http://www.karlin.mff.cuni.cz/~kulich/vyuka/Rdoc/harrell-R-latex.pdf 
cat(' 
    \\documentclass{article} 
    \\usepackage[table]{xcolor} 
    \\begin{document} 
    <<results=tex>>= 
    library(Hmisc) 
    d <- head(iris) 
    cellTex <- matrix(rep("", nrow(d) * ncol(d)), nrow=nrow(d)) 
    cellTex[2,2] <- "cellcolor{red}" 
    cellTex[2,3] <- "color{red}" 
    cellTex[5,1] <- "rowcolor{yellow}" 
    latex(d, file = "", cellTexCmds = cellTex, rowname=NULL) 
    @ 
    \\end{document}', 
    file="tmp.Rnw") 
Sweave("tmp.Rnw") 
library(utils) 
texi2pdf("tmp.tex") 
+1

1+ para Hmisc :: ejemplo de látex. Dada la cantidad de cosas útiles que he obtenido de tus páginas, Vincent, creo que obtienes un pase gratis en cualquier copia desvergonzada que hagas. –

2

Para generar tablas de látex de objetos R, puede usar el paquete xtable. Es available on CRAN, eche un vistazo a la documentación. Para obtener el color en la tabla, use el paquete de látex color. Algunos código de ejemplo:

library(xtable) 
n = 100 
cat_country = c("NL","BE","HU") 
cat_prim = c("primary","secondary","tertiary") 
dat = data.frame(country = sample(cat_country, n, replace = TRUE), 
       prim = sample(cat_prim, n, replace = TRUE)) 
ftable_dat = ftable(dat) 

## Make latex table: 
latex_table = xtable(as.table(ftable_dat)) 

Para obtener lo que desea hice el siguiente hack (feo). El truco consiste en imprimir el objeto xtable y de editar que:

latex_table = within(latex_table, { 
# browser() 
    primary = ifelse(primary > 12, sprintf("\\textbf{%s}", primary), primary) 
    #primary = sub("\\{", "{", primary) 
}) 
printed_table = print(latex_table) 
printed_table = sub("backslash", "\\", printed_table) 
printed_table = sub("\\\\}", "}", printed_table) 
printed_table = sub("\\\\\\{", "{", printed_table) 
printed_table = sub("\\$", "\\", printed_table) 
printed_table = sub("\\$", "\\", printed_table) 
cat(printed_table) 

que nos lleva a:

% latex table generated in R 2.14.1 by xtable 1.6-0 package 
% Thu Feb 16 13:10:55 2012 
\begin{table}[ht] 
\begin{center} 
\begin{tabular}{rrrr} 
    \hline 
& primary & secondary & tertiary \\ 
    \hline 
BE & 10 & 5 & 11 \\ 
    HU & \textbf{13} & 13 & 8 \\ 
    NL & 11 & 17 & 12 \\ 
    \hline 

\ end {tabular} \ end {center} \ end {table}

Este ejemplo hace que un número en la categoría principal sea negrita, pero puede trabajar para la coloración con la misma facilidad. ¿Tal vez alguien más tiene una solución más elegante?