使用kable和knitr保留table()中的行/列标签

arv*_*000 14 markdown r xtable knitr

table基本R中的函数添加了漂亮的行/列标签,但是当我使用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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

# 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')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

arv*_*000 6

很遗憾,其他人在我的旧问题上发了一笔赏金.无论如何,如果它有用,我的解决方案是自制的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)
}
Run Code Online (Sandbox Code Playgroud)

现在这个降价文档:

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))
```
Run Code Online (Sandbox Code Playgroud)

产生我想要的结果:

在此输入图像描述

生成的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>
Run Code Online (Sandbox Code Playgroud)


mik*_*eck 6

@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
Run Code Online (Sandbox Code Playgroud)

结果是:

|a/b  | big| small|
|:----|---:|-----:|
|down |   5|     1|
|up   |   0|     4|
Run Code Online (Sandbox Code Playgroud)


cde*_*man 1

虽然有点 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)
Run Code Online (Sandbox Code Playgroud)