Kon*_*rad 3 markdown r crosstab knitr 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")
```
Run Code Online (Sandbox Code Playgroud)
生成这个令人愉快的表:

我更喜欢包中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
========================================================
Run Code Online (Sandbox Code Playgroud)
我想要实现的是使用与CrossTable我使用表结果相同的方式生成的结果.特别是,我有兴趣将这些结果强制执行,kable因此格式很好.我通过StackOverflow浏览并遇到了关于在knitr中打印交叉表或在xtables中引入计数和百分比的相关讨论.那里讨论的解决方案似乎很精细.实际上,我只想将CrossTable输出移动到kable可以理解重新格式化的对象.
尝试使用pander 常规S3方法而不是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%
------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
虽然它目前不支持抑制行百分比,但您可以原生地抑制列或总百分比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%
------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
关于行百分比支持,请在相关问题上添加评论,我很确定@RomanTsegelskyi很乐意解决这个问题.