2014-10-17 23 views
12

La funzione table nella base R aggiunge etichette di riga/colonna belle, ma quando uso knitr::kable queste vanno via. Un modo semplice per mantenerli, oltre ad aggiungerli sul lato html/markdown?Mantieni etichette riga/colonna da table() usando kable e knitr

esempio riproducibile:

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) 

enter image description here

# 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') 

enter image description here

+0

si può vedere se il pacchetto printr sembra interessante per voi: http://yihui.name/printr/ –

risposta

1

Anche se un po 'hacky, combinando il pacchetto tables e xtable può ottenere il codice html della tabella di contingenza con la fila/nomi di colonne. Per te funziona?

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) 
+0

Grazie per la risposta . Penso che questo sia più linee/più complessità del semplice attaccamento con 'kable' e l'accesso alle etichette tramite' nomi (dimnames (...)) 'per la visualizzazione nel doc markdown, anche se – arvi1000

+0

@ arvi1000, d'accordo, è tutto ciò che funziona meglio per te. – cdeterman

4

Non una soluzione ottimale (come markdown del Pandoc non supporta col/rowspans), ma dare una prova di pander, che è destinato a trasformare R oggetti in markdown con facilità (e serie di opzioni):

> 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 | 
5

Ordinato che qualcun altro abbia pubblicato una taglia sulla mia vecchia domanda. In ogni caso, se è disponibile, la mia soluzione è stata una funzione di generatore di homebrew 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) 
} 

Ora questo Markdown doc:

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)) 
``` 

produce i risultati che avevo voluto:

enter image description here

Il l'html generato è in qualche modo leggibile anche:

<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> 
+0

Funziona solo con una tabella bidimensionale, ma può contenere qualsiasi numero di righe/colonne. Trovo che qualsiasi tabella che voglio mostrare sia in genere 2d, ma qualcuno potrebbe estendere questo se più dims desiderato – arvi1000

+0

Hmm non sembra funzionare su un documento pdf. Esegue semplicemente l'HTML come codice. Grazie per la condivisione però! (edit: in realtà appare come codice anche con html_document. Non sono sicuro del perché i nostri risultati differiscono) – Jeff

+0

è riuscito a farlo funzionare in HTML rimuovendo il '\ t's, ma sfortunatamente non funziona ancora in un documento pdf – Jeff

6

@Yihui dovrebbe ottenere il merito. Direttamente dal pacchetto di 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 

risultati in:

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

Siamo spiacenti, sto cercando le etichette degli assi effettivi, non un'altra voce nella riga di intestazione. Capita anche di guardare [cattivo] (http://i.imgur.com/PujdBWl.png) sui miei dati, e mi permette solo di usare i nomi delle colonne data.table (al contrario di una stringa) – Jeff