Раскрасьте/выделите значения выходных данных R ftable() в раппортах Knitr/Sweave.

Я создаю множество перекрестных таблиц ftable() для описательного отчета. Пример:

              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

Я ищу функцию, которая могла бы принимать выходные данные ftable() или table() и выделять значения, которые отклоняются от среднего значения строки, или назначать общий градиент тексту значений, например. от 0 до 100% значения окрашиваются от красного до зеленого.

Вывод теперь обрабатывается с помощью knitr, но я не уверен, в какой момент цепочки инструментов я мог бы вмешаться и добавить цвет на основе относительного размера значений.


person mhermans    schedule 16.02.2012    source источник
comment
Вы также можете опубликовать этот вопрос на сайте обмена TeX/LaTeX, если вы не получите здесь хороших ответов.   -  person Paul Hiemstra    schedule 16.02.2012


Ответы (2)


Вы можете использовать функцию latex в пакете 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")
person Vincent Zoonekynd    schedule 16.02.2012
comment
1+ для примера Hmisc::latex. Винсент, учитывая то количество полезного материала, которое я почерпнул с твоих страниц, я думаю, ты получаешь бесплатный пропуск за любое бесстыдное копирование, которое ты делаешь. - person IRTFM; 17.02.2012

Чтобы сгенерировать латексные таблицы из объектов R, вы можете использовать пакет xtable. Он доступен в CRAN, взгляните на документацию. Чтобы получить цвет из таблицы, используйте пакет латекса color. Некоторый пример кода:

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

Чтобы получить то, что вы хотите, я сделал следующий хак (уродливый). Хитрость заключается в том, чтобы распечатать объект xtable, а затем отредактировать его:

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)

Что приводит к:

% 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{таблица}     \end{center}     \end{table}

В этом примере число в основной категории выделено полужирным шрифтом, но его можно так же легко использовать для раскрашивания. Может быть, у кого-то есть более элегантное решение?

person Paul Hiemstra    schedule 16.02.2012