I'm new to knitr (and also quite new to R), so this might be a dumb question...
I have two data.frames, which both have two columns, but different numbers of rows. I want to show them in my knitr report, but having one narrow table below another narrow table when they could so easily sit next to each other doesn't look good. Is there any way they could be displayed next to each other?
Update
Ok, based on the suggestion below, here's what I did (I'm putting three tables together now):
```{r fig.height=13.5, fig.width=10, echo=FALSE, comment=""}
grid.arrange(textGrob("Visual Clusters", gp=gpar(fontsize=14, fontface="bold")),
textGrob("We have biofilm data for...", gp=gpar(fontsize=14, fontface="bold")),
textGrob("Left Over Isolates", gp=gpar(fontsize=14, fontface="bold")),
tableGrob(clusters, show.rownames=FALSE, gp=gpar(fontsize=10)),
tableGrob(clust_ab, show.rownames=FALSE, gp=gpar(fontsize=10)),
tableGrob(n_clust, show.rownames=FALSE, gp=gpar(fontsize=10)),
ncol=3, nrow=2, heights=c(1,30))
```
This looks already really good, with titles for the three tables and without the numbered rows.
The only issue I couldn't resolve so far is that the tables are all centred horizontally, so the shorter ones start below the longest one, if you know what I mean.
The development version of knitr (on Github; follow installation instructions there) has a kable()
function, which can return the tables as character vectors. You can collect two tables and arrange them in the two cells of a parent table. Here is a simple example:
```{r two-tables, results='asis'}
library(knitr)
t1 = kable(mtcars, format='html', output = FALSE)
t2 = kable(iris, format='html', output = FALSE)
cat(c('<table><tr valign="top"><td>', t1, '</td><td>', t2, '</td><tr></table>'),
sep = '')
```
You can also use CSS tricks like style="float: [left|right]"
to float the tables to the left/right.
If you want to set cell padding and spacing, you can use the table attributes cellpadding
/ cellspacing
as usual, e.g.
```{r two-tables, results='asis'}
library(knitr)
t1 = kable(mtcars, format='html', table.attr='cellpadding="3"', output = FALSE)
t2 = kable(iris, format='html', table.attr='cellpadding="3"', output = FALSE)
cat(c('<table><tr valign="top"><td>', t1, '</td>', '<td>', t2, '</td></tr></table>'),
sep = '')
```
See the RPubs post for the above code in action.
Would you settle for "an image" of data.frames? Clearly my solution is crude, feel free to fiddle with the details (spacing between data.frames, for example).
Two data.frames, side by side
========================================================
```{r}
library(gridExtra)
x <- data.frame(a = runif(5), b = runif(5))
y <- data.frame(a = runif(7), b = runif(7))
grid.arrange(tableGrob(x), tableGrob(y), ncol = 2)
```
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With