2012-08-02 14 views
12

Ich möchte xtable für den Export in LaTeX anpassen. Ich weiß, dass es hier einige Fragen über xtable gibt, aber ich konnte die spezifischen Sachen nicht finden, nach denen ich suche. HierCustomize xtable

ist ein Beispiel dafür, wie meine Tabelle aussehen könnte:

my.table <- data.frame(Specifiers=c("","Spec1", "Spec2", "Spec3"), 
    Values1 = c("N=10", 1.03, 1.71, 2.25), 
    Values2 = c("N=20", 1.32, 1.79, 2.43)) 
colnames(my.table)[1] <- "" 

Welche schafft:

  Values1 Values2 
1   N=10 N=20 
2 Spec1 1.03 1.32 
3 Spec2 1.71 1.79 
4 Spec3 2.25 2.43 

In der Tat, diese Tabelle aus einer CSV-Datei als data.frame mit my.table <- read.delim("filename.csv", sep=",", header=TRUE) importiert

Jetzt erstelle ich eine LaTeX-Tabelle mit xtable:

Hier
latex.tab <- xtable(my.table, caption=c("Stats")) 
print(latex.tab, file="Summarystats.tex", 
    floating.environment='sidewaystable', 
    include.rownames=FALSE, 
    booktabs=TRUE, 
    latex.environment=NULL) 

ist der resultierende LaTeX-Code:

\begin{sidewaystable}[ht] 
\begin{tabular}{lllllll} 
    \toprule 
& Values1 & Values2 \\ 
    \midrule 
       N=10 & N=20 \\ 
    Spec1 & 1.03 & 1.32 \\ 
    Spec2 & 1.71 & 1.79 \\ 
    Spec3 & 2.25 & 2.43 \\ 

    \bottomrule 
\end{tabular} 
\end{sidewaystable} 

Ok, und jetzt ist es das, was ich möchte ändern:

1) Legen Sie \midrule nach der zweiten Zeile statt nach dem ersten . 2) Alternierende Farben der Zeilen dieser Tabelle durch Einfügen von \rowcolors{2}{gray!25}{white} in die sidewaystable (oder normale table) Umgebung. 3) Rotierende Spaltennamen um 45 ° 4) Fügen Sie \centering statt der center -Umgebung in Fällen ein, wenn ich den Tisch zentrieren möchte.

Irgendwelche Ideen, wie man das erreicht?

+2

(1) manuell 'add.to.row' mit getan werden kann. Die anderen, ich denke, Sie müssen möglicherweise ein anderes Werkzeug für verwenden. 'Latex' in ** Hmisc ** ist normalerweise flexibler als' xtable'. – joran

Antwort

11

Sie müssen einig Vorverarbeitung verabschiedete zusätzliches Argument zu print.xtable und etwas Nachbearbeitung:

my.table <- data.frame(Specifiers=c("","Spec1", "Spec2", "Spec3"), 
         Values1 = c("N=10", 1.03, 1.71, 2.25), 
         Values2 = c("N=20", 1.32, 1.79, 2.43)) 
colnames(my.table)[1] <- "" 

# Pre-processing: rotates column names by 45 degrees 
head = apply(as.array(names(my.table)), 1, function(x) paste("\\rotatebox{45}{", x, "}")) 
head = paste(head, c(rep("&", length(head)-1), "\\\\\n"), collapse="") 

latex.tab <- xtable(my.table, caption=c("Stats")) 
ltable = print(latex.tab, file="", # File is empty, post-processing needed 
     floating.environment='sidewaystable', 
     include.rownames=FALSE, 
     include.colnames=FALSE, # No colnames 
     booktabs=TRUE, 
     latex.environment="center", # Or NULL 
     # Adds some extra-text after the rows specified in pos. 
     # Adds new \midrule and comments old one. 
     # Adds pre-processed names of columns 
     add.to.row=list(pos=as.list(c(0, 0, 1)), command=as.vector(c(head, "%", "\\midrule\n")))) 

# Post-processing: replaces \begin{center} with \centering 
ltable = sub("\\begin{center}\n", "\\centering\n", ltable, fixed=TRUE) 
ltable = sub("\\end{center}\n", "\n", ltable, fixed=TRUE) 

# Post-processing: adds alternating colours 
ltable = sub("\\begin{tabular}", 
      "\\rowcolors{2}{gray!25}{white}\n\\begin{tabular}", 
      ltable, fixed=TRUE) 

# Writes output to the file 
cat(ltable, file="Summarystats.tex") 

Wenn Sie als tabular andere Registerkarten Umgebung benötigen, können Sie 1) neue Variable hinzu:

TABULAR = "tabular" 

2) Direkt Wert print.xtable wie folgt ist:

... 
tabular.environment=TABULAR, 
... 

3) Ändern Sie Nachverarbeitung für wechselnde Farben:

ltable = sub(sprintf("\\begin{%s}", TABULAR), 
      sprintf("\\rowcolors{2}{gray!25}{white}\n\\begin{%s}", TABULAR), 
      ltable, fixed=TRUE) 

Ergebnis:

enter image description here

+1

Sie sollten die "center" Umgebung nicht mehr explizit ersetzen müssen. Ich habe die Unterstützung für den Befehl '\ centering' als Problem angesprochen (# 2104) und wurde vor ein paar Monaten von David Scott repariert. – Alastair

+0

Hallo @redmode, könnten Sie bitte eine xtable Lösung zu dieser Frage hinzufügen https://stackoverflow.com/questions/43098950/how-to-rotate-a-table-left-margin-name-with-knitr-and-xtable ? – skan