以下代码
---
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")
```
生成这个令人愉快的表格:
我更喜欢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
可以理解重新格式化的对象。
答案 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很乐意解决这个问题。