Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get dimnames in xtable.table output?

Tags:

r

xtable

I'd like to have the dimensions labeled in my xtable output. However, the table method of xtable does not output dimension labels even when I specify them manually to table:

set.seed(10)
d <- data.frame(x=sample(1:4),y=sample(1:4))
tb <- with(d, table(d,dnn=c("Xs","Ys")))
> tb
   Ys
Xs  1 2 3 4
  1 0 0 0 1
  2 0 1 0 0
  3 1 0 0 0
  4 0 0 1 0
> xtable(tb)
% latex table generated in R 2.15.1 by xtable 1.7-0 package
% Tue Oct  9 09:06:10 2012
\begin{table}[ht]
\begin{center}
\begin{tabular}{rrrrr}
  \hline
 & 1 & 2 & 3 & 4 \\ 
  \hline
1 &   0 &   0 &   0 &   1 \\ 
  2 &   0 &   1 &   0 &   0 \\ 
  3 &   1 &   0 &   0 &   0 \\ 
  4 &   0 &   0 &   1 &   0 \\ 
   \hline
\end{tabular}
\end{center}
\end{table}

Inspection of the code for xtable.table doesn't yield any secrets. Short of building them manually with multirow is there any way of getting the dimensions labeled?

like image 301
Ari B. Friedman Avatar asked Oct 09 '12 13:10

Ari B. Friedman


2 Answers

One solution with the tables package:

library(tables) 

tblr <- tabular((Xs = as.factor(x)) ~ (Ys = as.factor(y)), data = d)
latex(tblr)

\begin{tabular}{lcccc}
\hline
 & \multicolumn{4}{c}{Ys} \\ 
Xs  & 1 & 2 & 3 & \multicolumn{1}{c}{4} \\ 
\hline
1  & $0$ & $0$ & $0$ & $1$ \\
2  & $0$ & $1$ & $0$ & $0$ \\
3  & $1$ & $0$ & $0$ & $0$ \\
4  & $0$ & $0$ & $1$ & $0$ \\
\hline 
\end{tabular}
like image 87
adibender Avatar answered Nov 10 '22 06:11

adibender


This doesn't create multirow or multicolumn headers based on the names of the dimensions, but it at least does get them displayed.

print(xtable(format(ftable(tb))), 
      include.rownames=FALSE, include.colnames=FALSE,
      sanitize.text.function = function(x) {gsub('"',"",x)})

which gives

% latex table generated in R 2.15.1 by xtable 1.7-0 package
% Tue Oct 09 11:28:33 2012
\begin{table}[ht]
\begin{center}
\begin{tabular}{llllll}
  \hline
  \hline
     & Ys & 1 & 2 & 3 & 4 \\ 
  Xs &      &     &     &     &     \\ 
  1  &      &   0 &   0 &   0 &   1 \\ 
  2  &      &   0 &   1 &   0 &   0 \\ 
  3  &      &   1 &   0 &   0 &   0 \\ 
  4  &      &   0 &   0 &   1 &   0 \\ 
   \hline
\end{tabular}
\end{center}
\end{table}

You can restore the horizontal lines in the "right" place as well:

print(xtable(format(ftable(tb))), 
      include.rownames=FALSE, include.colnames=FALSE,
      sanitize.text.function = function(x) {gsub('"',"",x)},
      hline.after = c(-1, 2, nrow(tb)+2))

giving

% latex table generated in R 2.15.1 by xtable 1.7-0 package
% Tue Oct 09 11:29:21 2012
\begin{table}[ht]
\begin{center}
\begin{tabular}{llllll}
  \hline
      & Ys & 1 & 2 & 3 & 4 \\ 
  Xs &      &     &     &     &     \\ 
   \hline
1  &      &   0 &   0 &   0 &   1 \\ 
  2  &      &   0 &   1 &   0 &   0 \\ 
  3  &      &   1 &   0 &   0 &   0 \\ 
  4  &      &   0 &   0 &   1 &   0 \\ 
   \hline
\end{tabular}
\end{center}
\end{table}
like image 39
Brian Diggs Avatar answered Nov 10 '22 07:11

Brian Diggs