在knitr中打印漂亮的交叉表

时间:2014-08-26 23:00:00

标签: r knitr xtable stargazer

我想要的是使用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

4 个答案:

答案 0 :(得分:6)

来自具有相同名称的包的kable的替代pander,这提供了一种生成具有大量选项(如style)和通用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样式管道表,请添加stlye='rmarkdown'参数,尽管AFAIK Pandoc也是新标准,它支持上述多行表。

答案 1 :(得分:5)

我建议您使用stargazer,如下所示:

  • 使用quote=FALSE
  • 请务必指定type="html"

试试这个:

# stargazer

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

enter image description here

答案 2 :(得分:3)

进一步挖掘引导我this question

答案很明显 - 'tables'包裹!

我认为必须有一种更简单的方法来做到这一点。非常感谢Andrie和daroczig的有益回应。

答案 3 :(得分:1)

考虑 tbl_cross 包中的 gtsummary

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