2012-05-22 10 views
11

Wenn die Kategorien der Attribute in einer Kontingenztabelle nur Zahlen sind, ist die Verwendung nur dieser Zahlen als Spalten-/Zeilenkopf nicht ausreichend - eine Beschreibung der Zahlen gemein heißt. Das untere Bild zeigt die Quer Klassifizierung von Haushaltsgröße gegenüber der Anzahl der Ausländer in einem Haushalt Beispiel:Dimensionsnamen in Zeilen- und Spaltenüberschriften für LaTeX-formatierte Kontingenztabelle einschließen

Example table

Hat jemand Erfahrung in der Herstellung von solchen Tabellen R + Latex verwendet?

Antwort

0

Es gibt ftable, die eine Kontingenztabelle in eine zweidimensionale Tabelle formatiert dreht sich um und ermöglicht die Angabe, was in Zeilen und was in den Spalten dargestellt (auch nützlich für die Tabellen von mehr als zwei Dimensionen). Das memisc Paket hilft, diese in schöne LaTeX drehen:

library(magrittr) 
library(memisc) 
expand.grid(Foreigners = 0:5, `Total persons` = 1:8) %>% 
    cbind(Freq = rnorm(6*8, 20, 10)) %>% 
    xtabs(formula = Freq~.) %>% 
    ftable %>% 
    toLatex 

Kein Hacking benötigt, und LaTeX kann für die Namen der Spalten in expand.grid verwendet wird (zum Beispiel Rotation und/oder über mehrere Zeilen zu unterstützen). Der generierte LaTeX-Code erfordert die Pakete booktabs und dcolumn.

Compiled output

Verwandte: Creating a latex table from ftable object in R.

0

Hier ist ein Ansatz. Beginnen Sie mit einigen Daten (Sie sollten dies tun, wenn Sie die Frage stellen) in Matrixform.

dat<-matrix(round(rnorm(9,20,10)),3,3) 

Erstellen Sie einen Vektor von Namen. Übernehmen Sie die Namen in die Matrix. Drucken Sie die Matrix

Sie können Xtable verwenden, um eine Latex-formatierte Tabelle auszugeben.

+0

Sicher hätte ich ein minimales Arbeitsbeispiel gepostet. Tut mir leid, dass ich es nicht getan habe. Stört es dich, wenn ich dein Beispiel anpasse? - Das generierte Xxtable enthält jedoch nicht die Dimensionsnamen. – krlmlr

+0

Kein Problem. Und ja, ich habe später festgestellt, dass die Latex-Ausgabe die Dimensionsnamen nicht enthält. Mein Ansatz wäre wahrscheinlich, das in tex selbst zu beheben, aber wenn Sie herausfinden, wie es direkt mit xtable tun tun lassen Sie mich wissen. – charlie

+0

Siehe meine eigene Antwort für eine "xtable" -Lösung. – krlmlr

6

Ich habe eine ziemlich haschische Lösung, aber ich würde gerne andere Ansätze sehen. Natürlich wäre es schön, wenn eine Variante dieses Codes zu xtable hinzugefügt wurde.

Meine Lösung besteht darin, die rownames() und colnames() der Tabelle zu aktualisieren. Der Zeilenkopf geht in rownames()[1] und der Spaltenkopf geht in colnames()[1]. Mehrere Dinge müssen beachtet werden:

  • Die Anzahl der Spalten in der resultierenden Tabelle ist um eins größer, wenn Zeilenköpfe verwendet werden. Daher muss die tabular Umgebung vom Benutzer erstellt werden.
  • Wenn eine Zeile Header hinzugefügt wird, muss die Spaltenüberschrift eine zusätzliche &
  • schließen Sie die Zeile oder Spaltennamen nicht sanieren oder auf andere Weise zu formatieren nach dieser Operation

Die add.crosstab.headers Funktion kümmert sich um alles. Es kann auf das Ergebnis eines xtable() Aufrufs angewendet werden. Einige Hilfsfunktionen sind ebenfalls erforderlich.

macrify <- function(m, s, bs='\\') { 
    paste(bs, m, '{', s, '}', sep='') 
} 

boldify <- function(s) { 
    macrify('textbf', s) 
} 

add.crosstab.headers <- function(t, row.header=NA, col.header=NA, 
           sanitize=boldify) { 
    rownames(t) <- sanitize(rownames(t)) 
    colnames(t) <- sanitize(colnames(t)) 
    if (!is.na(row.header)) { 
    colnames(t)[1] <- paste('&', colnames(t)[1]) 
    rownames(t) <- paste('&', rownames(t)) 
    row.header <- sanitize(row.header) 
    row.header <- macrify('rotatebox{90}', row.header) 
    multirow <- macrify('multirow', nrow(t)) 
    multirow <- macrify(multirow, '*', bs='') 
    row.header <- macrify(multirow, row.header, bs='') 
    rownames(t)[1] <- paste(row.header, rownames(t)[1]) 
    } 
    if (!is.na(col.header)) { 
    col.header <- sanitize(col.header) 
    multicolumn <- macrify('multicolumn', ncol(t)) 
    multicolumn <- macrify(multicolumn, 'c', bs='') 
    col.header <- macrify(multicolumn, col.header, bs='') 
    col.header <- paste(col.header, '\\\\\n') 
    col.header <- paste(col.header, '&') 
    if (!is.na(row.header)) { 
     col.header <- paste('&', col.header) 
    } 
    colnames(t)[1] <- paste(col.header, colnames(t)[1]) 
    } 
    t 
} 

Die Verwendung wäre so.

dat <- matrix(round(rnorm(9, 20, 10)), 3, 3) 
t <- xtable(dat) 
t <- add.crosstab.headers(t, row.header='Foreigners', col.header='Total persons') 

print.xtable(t, 
      only.contents=TRUE, 
      booktabs=TRUE 
      , sanitize.text.function=identity 
      ) 
Verwandte Themen