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
)
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
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
Siehe meine eigene Antwort für eine "xtable" -Lösung. – krlmlr