【问题标题】:Preserve row/column labels from table() using kable and knitr使用 kable 和 knitr 从 table() 中保留行/列标签
【发布时间】:2014-12-13 07:34:42
【问题描述】:

基础 R 中的 table 函数添加了漂亮的行/列标签,但是当我使用 knitr::kable 时,这些标签就消失了。除了将它们添加到 html/markdown 端之外,还有什么简单的方法可以保留这些?

可重现的例子:

library(knitr)

# reproducibility
set.seed(123) 

# here's a df
some_data <-
  data.frame(a=sample(c('up','down'), 10, replace=T),
             b=sample(c('big','small'), 10, replace=T))

# using table() you get nice labels ('a' and 'b', in this case)
table(some_data)

# that goes away with kable, in either markdown or html format (I care about html)
kable(table(some_data))
kable(table(some_data), format='html')

【问题讨论】:

标签: r markdown knitr xtable


【解决方案1】:

@Yihui 应该得到这个功劳。直接来自printr 包:

# BEGINNING of Rmd file:

```{r echo=FALSE}
# devtools::install_github("yihui/printr")
require(printr)

# reproducibility
set.seed(123) 

# here's a df
some_data <-
  data.frame(a=sample(c('up','down'), 10, replace=T),
             b=sample(c('big','small'), 10, replace=T))

table(some_data)
```

# End of Rmd file

结果:

|a/b  | big| small|
|:----|---:|-----:|
|down |   5|     1|
|up   |   0|     4|

【讨论】:

  • 对不起,我正在寻找实际的轴标签,而不是标题行中的另一个条目。它也恰好在我的数据上查看 bad,并且只允许我使用 data.table 列名(而不是字符串)
【解决方案2】:

很高兴有人在我的旧问题上发布了赏金。无论如何,如果有帮助,我的解决方案是自制的 html 生成器函数

table_label <- function(tbl) {

  # table dimensions
  rows <- dim(tbl)[1]
  cols <- dim(tbl)[2]

  # get started
  html_out <- '<table>\n'

  # first row: label only
  blank_cell <- '<td>&nbsp;</td>'
  html_out <- 
    paste0(html_out,
           '\t<tr>',
           blank_cell, 
           '<td>', names(dimnames(tbl))[2], '</td>', # column label
           rep(blank_cell, cols-2),
           '</tr>\n')

  # second row:
  html_out <- 
    paste0(html_out,
           '\t<tr>',
           # label...
           '<td>', names(dimnames(tbl))[1], '</td>',
           # ...and headers
           paste0('<td>', dimnames(tbl)[[2]], '</td>', collapse=''),
           '</tr>\n')

  # subsequent rows
  for (i in 1:rows) {
    html_out <- 
      paste0(html_out,
             '\t<tr>',
             # header... 
             '<td>', dimnames(tbl)[[1]][i], '</td>',                        
             # ...and values
             paste0('<td>', tbl[i,], '</td>', collapse=''),
             '</tr>\n')
  }

  # last row
  html_out <- paste0(html_out, '</table>')
  return(html_out)
}

现在这个降价文档:

Produce table
```{r}
set.seed(123) 

some_data <-
  data.frame(a=sample(c('up','down'), 10, replace=T),
             b=sample(c('big','small', 'medium'), 10, replace=T))

tbl <- table(some_data)
```

Now display
```{r, results='asis'}
cat(table_label(tbl))
```

产生我想要的结果:

生成的 html 也有点可读性:

<table>
    <tr><td>&nbsp;</td><td>b</td><td>&nbsp;</td></tr>
    <tr><td>a</td><td>big</td><td>medium</td><td>small</td></tr>
    <tr><td>down</td><td>4</td><td>0</td><td>2</td></tr>
    <tr><td>up</td><td>0</td><td>4</td><td>0</td></tr>
</table>

【讨论】:

  • 这仅适用于二维表,但可以容纳任意数量的行/列。我发现我想显示的任何表格通常都是 2d 的,但是如果需要更多的暗淡,有人可以扩展它
  • 嗯似乎不适用于 pdf_document。它只是将 HTML 输出为代码。不过感谢分享! (编辑:实际上,即使使用 html_document,它也会显示为代码。我不确定为什么我们的结果不同)
  • 通过删除\ts 设法让它在 HTML 中工作,但不幸的是仍然不能在 pdf_document 中工作
  • 嗯。您是否使用cat 在块中打印结果,并且您是否在块选项中指定results='asis'?两者都是必要的。然后我用knitr::knit2html('input_file.Rmd', 'output_file.html') 编织
  • 是的。如前所述,当我删除 \ts 时它起作用了,尽管仅适用于 html_document
【解决方案3】:

不是最佳解决方案(因为 Pandoc 的 markdown 不支持 col/rowspans),但可以尝试 pander,它旨在轻松地将 R 对象转换为 markdown(以及一堆选项):

> library(pander)
> pander(ftable(some_data))

------ --- ----- -------
       "b" "big" "small"

 "a"                    

"down"       5      1   

 "up"        0      4   
------ --- ----- -------

> pander(ftable(some_data), style = 'rmarkdown')

|        |     |       |         |
|:------:|:---:|:-----:|:-------:|
|        | "b" | "big" | "small" |
|  "a"   |     |       |         |
| "down" |     |   5   |    1    |
|  "up"  |     |   0   |    4    |

【讨论】:

    【解决方案4】:

    虽然有点 hacky,但结合 tablesxtable 包可以让您获得带有行/列名称的列联表的 html。这对你有用吗?

    require(xtable)
    require(tables)
    
    some_data <-
      data.frame(a=sample(c('up','down'), 10, replace=T),
                 b=sample(c('big','small'), 10, replace=T))
    
    tab <- as.matrix(tabular(Factor(a)~Factor(b), data=some_data))
    
    print(xtable(data.frame(tab)), type="html", include.rownames=F, include.colnames=F)
    

    【讨论】:

    • 感谢您的回答。我觉得这比坚持使用kable 并通过names(dimnames(...)) 访问标签以显示在降价文档中要多行/更复杂
    • @arvi1000,同意,这是最适合你的。
    猜你喜欢
    • 2018-04-20
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多