2013-07-18 14 views
8

Jestem nowy dla knitr (a także całkiem nowy dla R), więc to może być głupie pytanie ...Wyrównaj dwa data.frames obok siebie za pomocą knitr?

Mam dwa data.frames, które mają dwie kolumny, ale różnią się liczbą wierszy. Chcę pokazać je w moim raporcie z dzianiny, ale posiadanie jednego wąskiego stołu pod innym wąskim stołem, kiedy mogli tak łatwo usiąść obok siebie, nie wygląda dobrze. Czy istnieje sposób, w jaki mogą być wyświetlane obok siebie?

Aktualizacja

Ok, na podstawie poniższej sugestii, oto co zrobiłem (Kładę trzy tabele teraz razem):

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

To wygląda już naprawdę dobry, z tytułów trzy tabele i bez ponumerowanych rzędów.
Jedynym problemem, którego nie udało mi się rozwiązać do tej pory, jest to, że stoły są wyśrodkowane w poziomie, więc te krótsze zaczynają się poniżej najdłuższego, jeśli wiesz, co mam na myśli.

+0

Czy używasz Markdown lub LaTeX? Jeśli to drugie, czy mógłbyś zadowolić się rozwiązaniem z tabelą LaTeX? –

+0

Do tej pory używam przecen. Nie pracowałem jeszcze z LaTeX. –

+0

jest to możliwe, jeśli używasz trochę CSS/HTML; ponieważ jesteś zadowolony z podejścia do fabuły, nie mam zamiaru dodawać kolejnej odpowiedzi. –

Odpowiedz

12

Rozwój wersja knitr (on Github; postępować zgodnie z instrukcjami tam instalacji) ma kable() funkcję, która może zwrócić tabel jako wektory postaci. Możesz zebrać dwie tabele i ułożyć je w dwóch komórkach tabeli nadrzędnej. Oto prosty przykład:

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

Można również użyć sztuczek CSS jak style="float: [left|right]" unosić tabele w lewo/prawo.

Jeśli chcesz ustawić dopełnienie i odstępy między komórkami, możesz użyć atrybutów tabeli, jak zwykle, np. cellpadding/cellspacing, np.

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

Zobacz powyższy kod w działaniu podając RPubs post.

+0

Dzięki! Dzięki temu mogę zrobić dokładnie to, czego chcę i nie muszę walczyć, aby uzyskać właściwe ustawienia tabel. –

+0

Czy istnieje jakiś sposób wpływania na wypełnianie komórek i odstępy w kable? Moje ramki danych mają nazwy w jednej kolumnie i cyfry jednocyfrowe w drugiej i są zbyt blisko siebie, aby były wygodne do czytania. –

+1

@ Lilith-Elina Zaktualizowałem odpowiedź, aby ustawić dopełnienie komórek. –

5

Czy zadowoliłbyś się "obrazem" data.frames? Najwyraźniej moje rozwiązanie jest prymitywne, nie krępuj się z detalami (na przykład odstępy między danymi.frame).

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

Awesome, thanks! Muszę sobie z tym poradzić, aby uzyskać dłuższy df (48 wierszy) w całości obok krótszego (tylko 7 wierszy), ale wygląda bardzo obiecująco. :-) –

+0

to jest świetne! czy wiesz, w jaki sposób mogę zacząć 2 stolik w tym samym momencie? – eliavs

Powiązane problemy