Tuesday, September 27, 2022

How to append two tables in R Markdown?

 Here is the task: how to append two tables using R Markdown? The need arose because I was demonstrating to graduate students in a research methods course how to prepare Table 1, which often covers descriptive statistics in an empirical paper.

I used tableone package in R to compute the summary statistics. The task was to replicate the first table from Prof. Daniel Hamermesh’s paper that explored whether instructors’ appearance and looks influenced the teaching evaluation score assigned by the students. Since Prof. Hammermesh computed some summary statistics using weighted data, such as weighted mean and weighted standard deviations, and non-weighted data using regular means and standard deviations, I relied on two different commands in tableone to compute summary statistics.

The challenge was to combine the output from the two tables into one table. Once I generated the two tables separately, I used kables() and list() options to generate the appended table. I needed knitr and kableExtra packages to format the table. Here is how the apended looks.


Here are the steps involved.

Assume that you have two tables generated by either svyCreateTableOne or CreateTableOne commands. Let’s store the results in objects tab1 and tab2.

In R Markdown using RStudio, print the tables to objects named arbitrarily as p and p1. See the code below. The results=’hide’ is needed if you do not want to see the tables outputted in the draft as text.

 

```{r, echo=FALSE, results='hide'}

p <- print(tab1)

p2 <-print(tab2)

```

The amalgamated table used the following script. Note some import considerations.

  1. I used bottomrule=NULL to suppress the horizontal line for the table on the top.
  2. I used column_spec(1, width = '1.75in') for both tables so that the second and subsequent columns lineup vertically. Otherise, they will appear staggered.
  3. I used col.names = NULL to suppress column names for the bottom table because the column names are the same for both tables.
  4. I used column_spec(5, width = '.7in') to ensure that the horizontal lines drawn for the bottom table match the width of the horizontal line on top of the first table.
  5. I used kable_styling(latex_options = "HOLD_position") to ensure that the table appears at the correct place in the text.

 I wish there was an easy command to fix the table width, but I didn’t find one. Still, I am quite pleased with the final output. I look forward to seeing ideas on improving the layout of appended tables.

```{r, echo=FALSE}

kables(

  list(

kable(p, booktabs=TRUE, format = "latex",valign='t',  bottomrule=NULL) %>%

 column_spec(1, width = '1.75in'),

kable(p2, booktabs=TRUE, format = "latex", valign='t', col.names = NULL) %>%

column_spec(1, width = '1.75in') %>%

column_spec(5, width = '.7in'))

caption="Weighted and unweighted data") %>%

kable_styling(latex_options = "HOLD_position")

```