سؤال

I am generating a lot of ftable() crosstabulations for a descriptive report. Example:

              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

I am looking for a function that could take the ftable() or table() output, and highligh values that deviate from the row-mean, or assign an overall gradient to the text of the values, e.g. from 0-100% the values are coloured from red to green.

The output is now processed through knitr, but I'm not sure at which point in the toolchain I could intervene and add colour based on the relative size of the values.

هل كانت مفيدة؟

المحلول

You can use the latex function, in the Hmisc package.

# 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")

نصائح أخرى

To generate latex tables from R objects, you can use the xtable package. It is available on CRAN, take a look at the documentation. To get the color in the table, use the color latex package. Some example code:

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))

To get what you want I made the following hack (ugly one). The trick is to print the xtable object and than edit that:

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)

Which leads to:

% 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}

This example makes a number in the primary category bold, but it can work for colorization just as easily. Maybe someone else has a more elegant solution?

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top