我使用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}
答案 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}