在knitr中打印漂亮的交叉表

18

我想要的是使用R、Markdown和knitr从RStudio中生成漂亮的交叉表格,可以在pdf文件或html文件中打印。我怀疑自己可能缺少一些非常明显的东西,因为我不敢相信这么难。我使用xtabs或ftable制作交叉表。

我想要的是类似于R控制台输出的漂亮打印版本。

> x
   Col
Row  A  B  C
  D 15  9  7
  E 13 14  9
  F  8  8 17
> f
    Col  A  B  C
Row             
D       15  9  7
E       13 14  9
F        8  8 17

我尝试了几种不同的解决方案,但都没有真正起作用,并且它们在附加的.Rmd文件中显示。(我尝试了pdf和html输出。)

---
title: "trial"
author: "Anthony Staines"
date: "26/08/2014"
output: html_document
---
# Make the data
```{r, echo=TRUE,results='asis',message=FALSE}
library(knitr)
library(memisc)
library(xtable)
library(stargazer)
library(texreg)

set.seed(893)
Col <- sample(c('A','B','C'),100,replace=TRUE)
Row <- sample(c('D','E','F'),100,replace=TRUE)
```

```{r, echo=TRUE,results='asis',message=FALSE}
x <- xtabs(~Row+Col)
x
kable(x)
kable(x,format='html')
kable(x,format='html',output = TRUE)
xx <- xtable(format(x))
print(xx,type='html')
stargazer(x)

f <-ftable(Row,Col)
f
kable(f,format='html')
kable(f,format='html',output = TRUE)
xf <- xtable(format(f))
print(xf,type='html')
stargazer(f)
```

kable最为接近,但似乎不支持行或列名,这两者对我来说都是必要的 :-

|   |  A|  B|  C|
|:--|--:|--:|--:|
|D  | 15|  9|  7|
|E  | 13| 14|  9|
|F  |  8|  8| 17|

感谢您的帮助,如果这是一个显而易见且广为人知的答案,那么我向您道歉,因为我可能问了一个非常愚蠢的问题!

Anthony Staines


kable() 支持列名;关于行名,它似乎不是 HTML 或 LaTeX 表格的标准组成部分,因此不清楚 "支持" 究竟意味着什么。 - Yihui Xie
我同意HTML和LaTeX都不直接支持这样的标签,但是为了使交叉表有意义,两者都是必需的。要求是生成一个可用于放入期刊文章中的表格。我现在实际上所做的是将R控制台输出转换为表格,使用Libre-Office中的Table->Convert->Text to Table功能,但这并不是非常可重复的! - astaines
4个回答

8

除了kable,还有一个叫做pander的包提供了一种简单的方式来生成带有许多选项(例如style)的Markdown表格,并且还提供了一个通用的S3方法:

> pander(x)

-------------------
&nbsp;   A   B   C 
------- --- --- ---
 **D**  15   9   7 

 **E**  13  14   9 

 **F**   8   8  17 
-------------------

> pander(f)

----- ----- --- --- ---
      "Col" "A" "B" "C"

"Row"                  

 "D"        15   9   7 

 "E"        13  14   9 

 "F"         8   8  17 
----- ----- --- --- ---

如果您想生成旧版的rmarkdown风格的管道表格,添加style='rmarkdown'参数即可,尽管据我所知,Pandoc也是新标准,支持上述多行表格。

尝试了一下,效果非常好 - 感谢您的指导,非常感激! - astaines
pander 给我一个错误 "Error in if (!has.rownames(df)) { : missing value where TRUE/FALSE needed" - iago
pander::pander() 打印交叉表格的规则。感谢开发者们。 - Edgar Manukyan

7

我建议您按照以下方式使用stargazer

  • 使用quote=FALSE
  • 确保指定type="html"

请尝试以下操作:

# stargazer

```{r, echo=TRUE, results='asis'}
stargazer(format(f, quote=FALSE, justify="right"), type="html")
```

enter image description here


我也尝试了这个方法,它也非常有效 - 感谢您的指导,非常感激! - astaines

3
进一步了解后,我找到了这个问题的答案。
答案非常明显——是'tables'包!
我本以为一定有更简单的方法来做这件事。尽管如此,仍然要感谢Andrie和daroczig提供的帮助性回应。

1
如果您知道您的输出将仅为LaTeX,那么制作复杂的表格相对容易,否则这不是一个简单问题。实现可移植性很困难(在Markdown、HTML、LaTeX和其他格式中使用复杂的表格)。 - Yihui Xie
我开始欣赏这个了!你已经完成的工作非常令人印象深刻,所以请接受我的感谢。 - astaines

1
考虑来自 `gtsummary` 包的 `tbl_cross` 表格:
library(gtsummary)

set.seed(893)
adf <- data.frame(Col = sample(c('A','B','C'),100,replace=TRUE),
                  Row = sample(c('D','E','F'),100,replace=TRUE))
tbl_cross(adf, row=Row, col=Col, percent="row")

gtsummary tbl_cross HTML crosstab example


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接