2014-09-30 21 views
1

我公司生产与CrossTable命令的横表从gmodels包如:R:CrossTable-如何使用xtable打印总行和列观测的频率?

library(gmodels) 
library(descr) 
a<-CrossTable(mtcars$cyl,mtcars$gear,prop.chisq = FALSE) 

如果我使用xtable创建用于胶乳的表时,频率为行总计(最后一栏)和列总计(最后一行) 缺失。但是,总数在那里。

我用:

print(xtable(a,digits=3)) 

实现这一目标。我如何获得这些值?

感谢您的支持。

编辑:

这里的输出的一个示例:

一个

=========================================== 
      mtcars$gear 
mtcars$cyl  3  4  5 Total 
------------------------------------------- 
4     1  8  2  11 
       0.091 0.727 0.182 **0.344** 
       0.067 0.667 0.400   
       0.031 0.250 0.062   
------------------------------------------- 
6     2  4  1  7 
       0.286 0.571 0.143 **0.219** 
       0.133 0.333 0.200   
       0.062 0.125 0.031   
------------------------------------------- 
8    12  0  2  14 
       0.857 0.000 0.143 **0.438** 
       0.800 0.000 0.400   
       0.375 0.000 0.062   
------------------------------------------- 
Total   15  12  5  32 
       **0.469** **0.375** **0.156** 
=========================================== 

我后xtable转换与*突出缺少的值。但是,当我把它转化为特克斯与print它看起来像:

\begin{table}[ht] 
\centering 
\begin{tabular}{llrrrr} 
    \hline 
& mtcars\$cyl & 3 & 4 & 5 & Total \\ 
    \hline 
1 & 4 & 1 & 8 & 2 & 11 \\ 
    2 & & 0.091 & 0.727 & 0.182 & \\ 
3 & & 0.067 & 0.667 & 0.400 & \\ 
4 & & 0.031 & 0.250 & 0.062 & \\ 
5 & 6 & 2 & 4 & 1 & 7 \\ 
6 & & 0.286 & 0.571 & 0.143 & \\ 
7 & & 0.133 & 0.333 & 0.200 & \\ 
8 & & 0.062 & 0.125 & 0.031 & \\ 
9 & 8 & 12 & 0 & 2 & 14 \\ 
    10 & & 0.857 & 0.000 & 0.143 & \\ 
    11 & & 0.800 & 0.000 & 0.400 & \\ 
    12 & & 0.375 & 0.000 & 0.062 & \\ 
    13 & Total & 15 & 12 & 5 & 32 \\ 
    \hline 
\end{tabular} 
\end{table} 
+0

这样的事情? 'data.frame(xtable(a))'可能会让你开始。 – johannes 2014-09-30 09:57:40

+0

不幸的是,这是行不通的。缺少的输出仍然不存在。此外,乳胶格式化已经消失。我编辑了我的问题,以防不清楚。 – user2386786 2014-09-30 11:46:10

回答

1

这可以被看作是在xtable.Crosstable方法的错误,这是在descr

environment(getS3method("xtable", "CrossTable")) 
<environment: namespace:descr> 

所以,你可能想联系一下这个软件包的维护者。同时这里是一个黑客,可以避免重新计算你自己的比例。

首先捕获来自xtable打印输出到一个临时文件,并重新读取每行作为一个单独的字符串:

file <- tempfile() 
capture.output(print(xtable(a, digits=3), include.rownames = FALSE), 
       file = file) 
xout <- readLines(file) 

我假设你不希望你的表格中rownames。做相同的CrossTable的印版:

capture.output(CrossTable(mtcars$cyl,mtcars$gear,prop.chisq = FALSE), 
      file = file) 
out <- readLines(file) 

接着提取印刷CrossTable输出的主体和“LaTeXize”它

body <- out[11:29] 
## replace whitespace by column delimiter 
body <- gsub(" *", " & ", body) 
## add end of line markup for table rows 
body <- gsub("([^-])$", "\\1 \\\\\\\\", body) 
## replace dashed lines with hline 
body <- gsub("-+", "\\\\hline", body) 
## replace $ with \$ 
body <- gsub("$", "\\$", body, fixed = TRUE) 

最后从印刷xtable输出打印页眉和页脚与新的体:

cat(xout[1:6], body, xout[22:24], sep = "\n") 

产生输出

% latex table generated in R 3.1.1 by xtable 1.7-4 package 
% Tue Oct 14 12:17:07 2014 
\begin{table}[ht] 
\centering 
\begin{tabular}{lrrrr} 
    \hline 
mtcars\$cyl & 3 & 4 & 5 & Total \\ 
\hline 
4 & 1 & 8 & 2 & 11 \\ 
& 0.091 & 0.727 & 0.182 & 0.344 \\ 
& 0.067 & 0.667 & 0.400 & \\ 
& 0.031 & 0.250 & 0.062 & \\ 
\hline 
6 & 2 & 4 & 1 & 7 \\ 
& 0.286 & 0.571 & 0.143 & 0.219 \\ 
& 0.133 & 0.333 & 0.200 & \\ 
& 0.062 & 0.125 & 0.031 & \\ 
\hline 
8 & 12 & 0 & 2 & 14 \\ 
& 0.857 & 0.000 & 0.143 & 0.438 \\ 
& 0.800 & 0.000 & 0.400 & \\ 
& 0.375 & 0.000 & 0.062 & \\ 
\hline 
Total & 15 & 12 & 5 & 32 \\ 
& 0.469 & 0.375 & 0.156 \\ 
\hline 
\end{tabular} 
\end{table} 
1

str(a)输出表明,那些失踪的print(xtable(a))输出的数字实际上不是a对象的一部分。行和列总计的频率在print.CrossTable方法中计算。看到这个,运行getS3method("print","CrossTable")。大致在输出的中间,你会看到

if (prop.r) { 
    ... 
    m[k, nc + 1] <- formatC(hdd * RS[i]/GT, digits = digits, 
      format = "f", decimal.mark = outDec) 
    ... 
} 

i是当前行中列联表,k是当前输出行(也有在列联表几个输出行的每一行),nc是应急表中的列数,RS[i]是应急表当前行的总行数,GT是总数,hdd可以是1或100,具体取决于输出格式。

这并不能解决问题,但至少可以解释为什么你看到与print(xtable(a))不同的结果,而不是简单的print(a)

+0

(+1)您可以编写一个快速函数从'a'中提取相关部分,并为'xtable.data.frame'手动计算比例 – user20650 2014-10-07 21:49:58