2013-07-18 39 views
8

我是新来的knitr(对于R也很新),所以这可能是一个愚蠢的问题...我有两个data.frames,它们都有两列,但行数不同。我想在我的编织报告中展示他们,但是当他们可以很容易地坐在一起时,在另一张狭窄的桌子下面放置一张窄桌子看起来不太好。 有没有什么办法可以彼此相邻显示?使用knitr对齐两个数据帧?

更新

好吧,基于下面的建议,这是我做了(我把三个表在一起现在):

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

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

+0

您是使用markdown还是LaTeX?如果是后者,你是否愿意用LaTeX桌子解决问题? –

+0

到目前为止,我正在使用降价。我还没有与LaTeX合作。 –

+0

如果你使用一点CSS/HTML,因为你对情节方法感到满意,所以我不会发表另一个答案 –

回答

12

开发版本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 = '') 
``` 

您还可以使用CSS的技巧,比如style="float: [left|right]"到表浮动到左/右。

如果要设置单元格填充和间距,可以像平常一样使用表格属性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

+0

谢谢!有了这个,我可以做到我想要的东西,而不必为了把桌子摆放好而战。 –

+0

是否有任何方法来影响单元格填充和间距?我的数据框在一列中有名字,而在另一列中有一位数字,并且它们太靠近在一起以便阅读舒适。 –

+1

@ Lilith-Elina我已经更新了设置单元格填充的答案。 –

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

+0

太棒了,谢谢!我不得不摆弄那些让更长的df(48行)完整地紧靠更短的(仅7行),但它看起来非常有前途。 :-) –

+0

这太棒了!你知道我怎么能得到2表开始在同一点? – eliavs