R:CrossTable-如何使用xtable打印总行和列观测的频率?

时间:2014-09-30 09:23:26

标签: r crosstab xtable

我使用CrossTable包中的gmodels命令生成了一个交叉表,例如:

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

如果我使用xtable为LaTex创建表,则缺少行总计(最后一列)和列总计(最后一行)的频率。但是,总计数在那里。

我用过:

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将其转换为Tex时,它看起来像:

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

2 个答案:

答案 0 :(得分: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)的结果不同。

答案 1 :(得分: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}