Reputation: 12178
I am trying to print out this table with xtable()
, which is reproduced below:
X B.1 B.2 B.3
1 (Intercept) -1.669 (0.093) -1.701 (0.094) -1.774 (0.121)
2 SEXFemale -0.46 (0.023) -0.386 (0.04) -0.274 (0.17)
3 SEXFemale:BLACK 0.132 (0.163)
4 SEXFemale:ASIAN -0.063 (0.089)
5 SEXFemale:HISPANIC -0.128 (0.074)
But I would like to override the way the first column is printed. Is it possible to include latex commands in xtable()
or some other function to do this? Specifically, I would like the first column to be :
X
Male: Female
Female X Black
X Asian
X Hispanic
i.e. I would like to write a \phantom{}
switch into the column so that the spacing comes out right.
Upvotes: 3
Views: 933
Reputation: 179398
You can use a regular expression to insert the \phantom{}
into your table before calling xtable()
:
Recreate your data:
x <- structure(list(X = structure(c(1L, 2L, 4L, 3L, 5L), .Label = c("(Intercept)",
"SEXFemale", "SEXFemale:ASIAN", "SEXFemale:BLACK", "SEXFemale:HISPANIC"
), class = "factor"), B.1 = structure(c(3L, 2L, 1L, 1L, 1L), .Label = c("",
"-0.46 (0.023)", "-1.669 (0.093)"), class = "factor"), B.2 = structure(c(3L,
2L, 1L, 1L, 1L), .Label = c("", "-0.386 (0.04)", "-1.701 (0.094)"
), class = "factor"), B.3 = structure(c(4L, 3L, 5L, 1L, 2L), .Label = c("-0.063 (0.089)",
"-0.128 (0.074)", "-0.274 (0.17)", "-1.774 (0.121)", "0.132 (0.163)"
), class = "factor")), .Names = c("X", "B.1", "B.2", "B.3"), class = "data.frame", row.names = c(NA,
-5L))
The regex:
x$X <- gsub("SEXFemale:", "\\\\phantom{Female} X ", x$X)
x$X <- gsub("SEXFemale", "Female", x$X)
library(xtable)
xx <- print(xtable(x), print.results = FALSE, include.rownames = FALSE,
sanitize.text.function=function(x)x)
cat(xx)
The resulting text:
% latex table generated in R 2.15.0 by xtable 1.7-0 package
% Thu Jul 26 17:10:05 2012
\begin{table}[ht]
\begin{center}
\begin{tabular}{llll}
\hline
X & B.1 & B.2 & B.3 \\
\hline
(Intercept) & -1.669 (0.093) & -1.701 (0.094) & -1.774 (0.121) \\
Female & -0.46 (0.023) & -0.386 (0.04) & -0.274 (0.17) \\
\phantom{Female} X BLACK & & & 0.132 (0.163) \\
\phantom{Female} X ASIAN & & & -0.063 (0.089) \\
\phantom{Female} X HISPANIC & & & -0.128 (0.074) \\
\hline
\end{tabular}
\end{center}
\end{table}
And the final output:
Upvotes: 2
Reputation: 70623
Ok here's one way of doing this.
# dummy example to get ANOVA table
ctl <- c(4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14)
trt <- c(4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69)
group <- gl(2,10,20, labels=c("Ctl","Trt"))
weight <- c(ctl, trt)
lm.D9 <- lm(weight ~ group)
# print xtable into a character
x <- print(xtable(lm.D9), print.results = FALSE)
What I'm doing here is finding specific words and wrapping them into \emph{}
. What you could do is have it replaced with a specific text or wrap in your custom switch.
x <- sub("(\\(Intercept\\))", "\\\\emph{\\1}", x)
x <- sub("(groupTrt)", "\\\\emph{\\1}", x)
cat(x)
% latex table generated in R 2.15.1 by xtable 1.7-0 package
% Thu Jul 26 17:41:16 2012
\begin{table}[ht]
\begin{center}
\begin{tabular}{rrrrr}
\hline
& Estimate & Std. Error & t value & Pr($>$$|$t$|$) \\
\hline
\emph{(Intercept)} & 5.0320 & 0.2202 & 22.85 & 0.0000 \\
\emph{groupTrt} & -0.3710 & 0.3114 & -1.19 & 0.2490 \\
\hline
\end{tabular}
\end{center}
\end{table}
Upvotes: 0