2017-05-02 2 views
4

Lets sagen, dass ich eine Tabelle in Sweave machen wollen, wie folgt aus:In Sweave, XTABLE, drehen nur einige Spaltennamen

<<tab2.1 , results = "asis", echo=FALSE, warning=FALSE>>= 
library(xtable) 
df <- data.frame(Fish=1:5, Bird=11:15) 

rownames(df) <- 2013:2017 

print(xtable(df), 
     rotate.colnames = TRUE) 
@ 

enter image description here

Nun möchte ich das Etikett des haben Plot im freien Raum über den Jahren und links vom FishBird, aber ohne Rotation. Ich habe versucht, in der xtable-Anleitung nachzuschlagen, aber es zeigt nicht, wie man nur einige Spaltennamen rotiert.

Antwort

4

Hier ist eine Problemumgehung. Ich lege zuerst die Jahre in eine Spalte und definiere meine eigene Funktion, um die Spaltennamen zu manipulieren. Dadurch kann ich den ersten Spaltennamen (in meinem Codebeispiel hier: rotated[1]) durch etwas anderes ersetzen.

library(xtable) 
df <- data.frame(rows = 2013:2017, Fish=1:5, Bird=11:15) 
# note that the rownames have their own column 

print(xtable(df), include.rownames = F, 
     sanitize.colnames.function = function(x){ 
     rotated <- paste("\\begin{sideways}", x, "\\end{sideways}") 
     # put all column names into sideways environments for the rotation. 
     return(c("Need coffee!", paste(rotated[-1], collapse="&")))} 
     # replaces first column name with something else (not rotated). 
) 

\begin{table}[ht] 
\centering 
\begin{tabular}{rrr} 
    \hline 
Need coffee! & \begin{sideways} Fish \end{sideways} &\begin{sideways} Bird \end{sideways} \\ 
    \hline 
2013 & 1 & 11 \\ 
    2014 & 2 & 12 \\ 
    2015 & 3 & 13 \\ 
    2016 & 4 & 14 \\ 
    2017 & 5 & 15 \\ 
    \hline 
\end{tabular} 
\end{table} 

Beachten Sie, dass Sie Ihre rownames immer noch haben können. Folgende Arbeiten genauso gut:

df <- data.frame(Fish=1:5, Bird=11:15) 
rownames(df) <- 2013:2017 
print(xtable(tibble::rownames_to_column(df)), include.rownames = F, 
     sanitize.colnames.function = function(x){ 
     rotated <- paste("\\begin{sideways}", x, "\\end{sideways}") 
     return(c("Need coffee!", paste(rotated[-1], collapse="&")))} 
) 
+0

Dies funktioniert, aber die row.names zu halten wäre schön, wie ich die in meinem wirklichen bin mit Daten. +1, aber ich werde mit dem accept warten, um zu sehen, ob eine andere Lösung verfügbar ist mit der row.names :) –

+0

Nun, wenn das Problem ist, dass Sie den Datenrahmen nicht ändern möchten, wickeln Sie es in 'tibble :: roownames_to_column' bei der Übergabe an 'xtable'. Ich habe meine Lösung bearbeitet, um Ihnen zu zeigen, wie. – coffeinjunky

0

Eine weitere Option, wenn Sie mit LaTeX-Code nicht direkt beschäftigen möchte, ist pixiedust zu verwenden, die Sie wählen können werden, welche Spalten geändert werden.

\documentclass{article} 
\usepackage{amssymb} 
\usepackage{arydshln} 
\usepackage{caption} 
\usepackage{graphicx} 
\usepackage{hhline} 
\usepackage{longtable} 
\usepackage{multirow} 
\usepackage[dvipsnames,table]{xcolor} 
\begin{document} 
\SweaveOpts{concordance=TRUE} 

<<tab2.1, results = tex>>= 
df <- data.frame(Year = 2013:2017, Fish=1:5, Bird=11:15) 

library(pixiedust) 
options(pixiedust_print_method = "latex") # This option must be set in Rnw files 

dust(df) %>% 
    medley_bw() %>% 
    sprinkle(cols = c("Fish", "Bird"), 
      rotate_degree = 90, 
      part = "head") %>% 
    print() %>% 
    cat() 
@ 


\end{document} 
+0

Ich bekomme den "Fehler in eval (exp, envir, enclos): object" tex "nicht gefunden. –

+0

Welche Art von Datei verwenden Sie? Ich verwende eine'. Rnw'-Datei in R Studio. – Benjamin

+0

Ja, ich Ich benutze das gleiche. Vermutung, dass ich die Tex (in meinem Pfad?) –

1

Eine andere Möglichkeit (mit meinem eigenen huxtable Paket):

library(huxtable) 
df <- data.frame(Fish=1:5, Bird=11:15) 
rownames(df) <- 2013:2017 
ht <- hux(df, add_rownames = TRUE, add_colnames = TRUE) 
ht[1, 1] <- 'Your advert here' 
number_format(ht) <- 0 
rotation(ht)[1, 2:3] <- 90 
ht 

enter image description here

Verwandte Themen