2014-09-30 20 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