Таблица LaTeX через xtable - PullRequest
1 голос
/ 21 мая 2011

Интересно, как получить таблицу LATEX с помощью функции xtable из следующего R кода.

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 

Используя следующий код

xtable(summary(aov(Yield~Block+A*B+Error(A*Block), data=aovdat)))

выдает следующую ошибку

Error in rbind(deparse.level, ...) : 
  numbers of columns of arguments do not match

Можно ли получить такую ​​таблицу LaTeX?

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 

Ответы [ 2 ]

7 голосов
/ 22 мая 2011

summary создает четыре таблицы в списке, поэтому lapply выглядит так:

mod <- aov(Yield ~ Block + A * B + Error(A * Block), data=aovdat)
lapply(summary(mod), xtable)

выдаст список таблиц LaTeX.

Цикл for с print создаст только код LaTeX с именами таблиц в заголовке LaTeX.

for (i in 1:4) print(xtable(summary(mod)[[i]], names(summary(mod)[i])))

Если вы хотите, чтобы все таблицы были как одна, вам нужно немного поработать, потому что rbind не любит таблицы с различным количеством столбцов. rbind.fill в пакете plyr сделает работу

library(plyr)

aovtab <- do.call(rbind.fill, lapply(1:length(summary(mod)), 
  function(x) unclass(summary(mod)[[x]])[[1]]))

но мы должны вручную добавить имена строк как данные, потому что a) rbind.fill удаляет их и b) они все равно дублируются, что xtable не понравится.

SOV <- unlist(lapply(1:length(summary(mod)), 
  function(x) rownames(unclass(summary(mod)[[x]])[[1]]))

print(xtable(cbind(SOV, aovtab), include.rownames=F)
5 голосов
/ 21 мая 2011

Поработав с этим некоторое время, кажется, что следующее дает результаты в форме LaTeX.

xtable(as.data.frame(unlist(coef(anova.mod))))

Это дает LaTeX таблицу блоков и их эффектов, как показано ниже.

\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}

Достаточно ли этого для ваших целей?

В общем, xtable предпочитает ввод матрицы или данных, а R часто возвращает списки, поэтому обычно я извлекаю интересующие меня части и затем преобразую их в матрицу или кадр данных.

Извините за уродливый TeX, здесь его нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...