用knitr将两个data.frames相互对齐?

时间:2013-07-18 07:33:11

标签: r knitr

我是knitr的新手(也是R的新手),所以这可能是一个愚蠢的问题......

我有两个data.frames,它们都有两列,但行数不同。我想在我的针织报告中展示它们,但是当它们可以很容易地坐在彼此旁边时,在另一张窄桌子下面有一张窄桌子并不好看。 有什么方法可以彼此相邻显示吗?

更新

好的,根据下面的建议,这就是我的所作所为(我现在把三张桌子放在一起):

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

这看起来非常好,有三个表的标题,没有编号的行 到目前为止我唯一无法解决的问题是表格都是水平居中的,所以如果你知道我的意思,较短的表格会从最长的表格开始。

2 个答案:

答案 0 :(得分:13)

knitr的开发版本(on Github;遵循那里的安装说明)有一个kable()函数,它可以将表作为字符向量返回。您可以收集两个表并将它们排列在父表的两个单元格中。这是一个简单的例子:

```{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 = '')
```

您还可以使用style="float: [left|right]"之类的CSS技巧将表格向左/向右浮动。

如果要设置单元格填充和间距,可以像往常一样使用表格属性cellpadding / cellspacing,例如

```{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 = '')
```

请参阅RPubs post以了解上述代码。

答案 1 :(得分:5)

你会满足于data.frames的“形象”吗?很明显,我的解决方案很粗糙,随意摆弄细节(例如data.frames之间的间距)。

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

enter image description here