Question

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?

Était-ce utile?

La solution

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}

Autres conseils

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}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top