LaTeX table through xtable
I wonder how to get LATEX table using xtable function from the following R code.
Block <- gl(8, 4)
A <- factor(c(0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,
0,1,0,1,0,1,0,1,0,1,0,1))
B <- factor(c(0,0,1,1,0,0,1,1,0,1,0,1,1,0,1,0,0,0,1,1,
0,0,1,1,0,0,1,1,0,0,1,1))
C <- factor(c(0,1,1,0,1,0,0,1,0,0,1,1,0,0,1,1,0,1,0,1,
1,0,1,0,0,0,1,1,1,1,0,0))
Yield <- c(101, 373, 398, 291, 312, 106, 265, 450, 106, 306, 324, 449,
272, 89, 407, 338, 87, 324, 279, 471, 323, 128, 423, 334,
131, 103, 445, 437, 324, 361, 302, 272)
aovdat <- data.frame(Block, A, B, C, Yield)
summary(aov(Yield~Block+A*B+Error(A*Block), data=aovdat))
Error: A
Df Sum Sq Mean Sq
A 1 3465.3 3465.3
Error: Block
Df Sum Sq Mean Sq
Block 7 4499 642.71
Error: A:Block
Df Sum Sq Mean Sq F value Pr(>F)
B 1 41616 41616 3.5354 0.1091
Residuals 6 70628 11771
Error: Within
Df Sum Sq Mean Sq F value Pr(>F)
B 1 119568 119568 7.3751 0.01673 *
A:B 1 28 28 0.0017 0.96734
Residuals 14 226975 16213
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Using the following code
xtable(summary(aov(Yield~Block+A*B+Error(A*Block), data=aovdat)))
producing the following error
Error in rbind(deparse.level, ...) :
numbers of columns of argume开发者_如何学Gonts do not match
Is it possible to get a LaTeX table like this?
SOV Df Sum Sq Mean Sq F value Pr(>F)
A 1 3465.3 3465.3
Block 7 4499 642.71
B 1 41616 41616 3.5354 0.1091
Residuals 6 70628 11771
B 1 119568 119568 7.3751 0.01673 *
A:B 1 28 28 0.0017 0.96734
Residuals 14 226975 16213
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
summary
is producing four tables in a list, so using lapply
like so:
mod <- aov(Yield ~ Block + A * B + Error(A * Block), data=aovdat)
lapply(summary(mod), xtable)
will produce a list of LaTeX tables.
A for
loop with print
will produce the LaTeX code only, with the table names in the LaTeX caption.
for (i in 1:4) print(xtable(summary(mod)[[i]], names(summary(mod)[i])))
If you want all the tables as one, you need to do a bit of work because rbind
doesn't like tables with different numbers of columns. rbind.fill
in the plyr package will do the job
library(plyr)
aovtab <- do.call(rbind.fill, lapply(1:length(summary(mod)),
function(x) unclass(summary(mod)[[x]])[[1]]))
but we have to manually add the rownames back as data because a) rbind.fill
drops them, and b) they were duplicated anyway, which xtable
wouldn't like.
SOV <- unlist(lapply(1:length(summary(mod)),
function(x) rownames(unclass(summary(mod)[[x]])[[1]]))
print(xtable(cbind(SOV, aovtab), include.rownames=F)
After playing with this for a little while, the following seems to produce results in LaTeX form.
xtable(as.data.frame(unlist(coef(anova.mod))))
This gives a LaTeX table of the blocks and their effects, as below.
\begin{table}[ht]
\begin{center}
\begin{tabular}{rr}
\hline
& unlist(coef(anova.mod)) \\
\hline
(Intercept).(Intercept) & 291.59 \\
A.A1 & 20.81 \\
Block.Block2 & -7.50 \\
Block.Block3 & 5.50 \\
Block.Block4 & -14.25 \\
Block.Block5 & -0.50 \\
Block.Block6 & 11.25 \\
Block.Block7 & -11.75 \\
Block.Block8 & 24.00 \\
A:Block.B1 & 144.25 \\
Within.B1 & 139.00 \\
Within.A1:B1 & 4.33 \\
\hline
\end{tabular}
\end{center}
\end{table}
Is this sufficient for your purposes?
In general, xtable prefers matrix or dataframe input, and R often returns lists, so what I normally do is extract the parts I am interested in and then convert to a matrix or a dataframe.
Apologies for the ugly TeX, there's no support for it here.
精彩评论