R:获取CrossTable(gmodels)的非繁琐方法可以很好地格式化(html)到markdown文档

时间:2014-12-17 15:54:26

标签: r markdown knitr crosstab r-markdown

以下代码

---
title: "Example"
output: html_document
---

```{r}
require(datasets)
data(esoph)
require(knitr, quietly = TRUE, warn.conflicts = FALSE)
kable(table(esoph$agegp, esoph$alcgp),
caption = "Some sample")
```

生成这个令人愉快的表格: Table example - kable and table

我更喜欢CrossTable包中gmodels函数生成的结果,我可以灵活地引入有趣的摘要:

> CrossTable(esoph$agegp, esoph$alcgp, digits = 1, prop.r = FALSE, prop.t = FALSE, chisq = FALSE,
+ prop.chisq = FALSE)
   Cell Contents 
|-------------------------|
|                       N | 
|           N / Col Total | 
|-------------------------|

========================================================
               esoph$alcgp
esoph$agegp    0-39g/day   40-79   80-119   120+   Total
--------------------------------------------------------
25-34                  4       4        3      4      15
                     0.2     0.2      0.1    0.2        
--------------------------------------------------------
35-44                  4       4        4      3      15
                     0.2     0.2      0.2    0.1        
--------------------------------------------------------
45-54                  4       4        4      4      16
                     0.2     0.2      0.2    0.2        
--------------------------------------------------------
55-64                  4       4        4      4      16
                     0.2     0.2      0.2    0.2        
--------------------------------------------------------
65-74                  4       3        4      4      15
                     0.2     0.1      0.2    0.2        
--------------------------------------------------------
75+                    3       4        2      2      11
                     0.1     0.2      0.1    0.1        
--------------------------------------------------------
Total                 23      23       21     21      88
                     0.3     0.3      0.2    0.2
========================================================

我想要实现的是使用CrossTable生成的结果,方法与我使用表格结果相同。特别是,我有兴趣在kable中强制执行这些结果,因此格式很好。我在浏览StackOverflow时遇到了关于 Printing cross-tabulations in knitr 或介绍 counts and percentages in xtables 的相关讨论。那里讨论的解决方案似乎很精细。实际上,我只想将CrossTable输出移动到kable可以理解重新格式化的对象。

1 个答案:

答案 0 :(得分:7)

尝试pander general S3 method而不是kable

> pander(CrossTable(esoph$agegp, esoph$alcgp, digits = 1))

------------------------------------------------------------
         0-39g/day   40-79    80-119    120+    Total  
------------ ----------- -------- -------- -------- --------
**25-34**\     \     \   \   \   \ 
    N\           4\        4\       3\       4\       15\   
 Row(%)\        27%\      27%\     14%\      5%\      17%   
 Column(%)      27%\      17%\     19%\      3%\            
                 20%       17%       5%       5%            

**35-44**\     \     \   \   \   \ 
    N\           4\        4\       4\       3\       15\   
 Row(%)\        27%\      20%\     19%\      5%\      17%   
 Column(%)      27%\      17%\     14%\      5%\            
                 27%       17%       5%       3%            

**45-54**\     \     \   \   \   \ 
    N\           4\        4\       4\       4\       16\   
 Row(%)\        25%\      25%\     19%\      5%\      18%   
 Column(%)      25%\      17%\     19%\      5%\            
                 25%       17%       5%       5%            

**55-64**\     \     \   \   \   \ 
    N\           4\        4\       4\       4\       16\   
 Row(%)\        25%\      25%\     19%\      5%\      18%   
 Column(%)      25%\      17%\     19%\      5%\            
                 25%       17%       5%       5%            

**65-74**\     \     \   \   \   \ 
    N\           4\        3\       4\       4\       15\   
 Row(%)\        27%\      27%\     19%\      3%\      17%   
 Column(%)      20%\      17%\     19%\      5%\            
                 27%       13%       5%       5%            

 **75+**\      \     \   \   \   \ 
    N\           3\        4\       2\       2\       11\   
 Row(%)\        27%\      18%\     10%\      5%\      12%   
 Column(%)      36%\      13%\     10%\      2%\            
                 18%       17%       3%       2%            

   Total        23\        23\      21\      21\      88\   
                 26%       26%      24%      24%            
------------------------------------------------------------

虽然它目前不支持抑制行百分比,但您可以使用CrossTable本机抑制列或总百分比:

> pander(CrossTable(esoph$agegp, esoph$alcgp, digits = 1, prop.c = FALSE, prop.t = FALSE, chisq = FALSE, prop.chisq = FALSE))

------------------------------------------------------------
         0-39g/day   40-79    80-119    120+    Total  
------------ ----------- -------- -------- -------- --------
**25-34**\     \     \   \   \   \ 
    N\           4\        4\       3\       4\       15\   
   Row(%)        27%       27%      20%      27%      17%   

**35-44**\     \     \   \   \   \ 
    N\           4\        4\       4\       3\       15\   
   Row(%)        27%       27%      27%      20%      17%   

**45-54**\     \     \   \   \   \ 
    N\           4\        4\       4\       4\       16\   
   Row(%)        25%       25%      25%      25%      18%   

**55-64**\     \     \   \   \   \ 
    N\           4\        4\       4\       4\       16\   
   Row(%)        25%       25%      25%      25%      18%   

**65-74**\     \     \   \   \   \ 
    N\           4\        3\       4\       4\       15\   
   Row(%)        27%       20%      27%      27%      17%   

 **75+**\      \     \   \   \   \ 
    N\           3\        4\       2\       2\       11\   
   Row(%)        27%       36%      18%      18%      12%   

   Total        23\        23\      21\      21\      88\   
                 26%       26%      24%      24%            
------------------------------------------------------------

关于行百分比支持,请在related issue添加评论,我很确定@RomanTsegelskyi很乐意解决这个问题。