Table 1 and the Characteristics of Study Population

[This article was first published on DataScience+, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

In research, especially in medical research, we describe characteristics of our study populations through Table 1. The Table 1 contain information about the mean for continue/scale variable, and proportion for categorical variable. For example: we say that the mean of systolic blood pressure in our study population is 145 mmHg, or 30% of participants are smokers. Since is called Table 1, means that is the first table in the manuscript.

To create the Table 1 sometimes it can be very time consuming. Imagine if we have 10 variables (e.g. age, gender.. etc) for 3 groups, and for each variable we compute mean (standard deviation) and number of participants (proportion); in the end we have to fill 60 numbers in the table. Moreover, we usually export the table from R to Microsoft Word, and we can be prone to making mistakes if we’re copy/pasting. Therefore, I did a search to find a simple and comprehensive way to make Table 1 with R. I found two very interesting packages named “Tableone” and “ReporteRs”. The TableOne package is created by Kazuki Yoshida and Justin Bohn and is used to create the Table 1 in R. The ReporteRs package is created by David Gohel and in this post I use for exporting Table from R to Microsoft Word.

Create Table 1

I simulated a dataset by using functions rnorm() and sample(). You can download this simulated data set on you desktop to replicate this post. To learn how to upload your dataset into R read this post.

dt <- read.csv(file.choose(), header=TRUE, sep=",")

   Age Gender Cholesterol SystolicBP  BMI Smoking Education
1 67.9 Female       236.4      129.8 26.4     Yes      High
2 54.8 Female       256.3      133.4 28.4      No    Medium
3 68.4   Male       198.7      158.5 24.1     Yes      High
4 67.9   Male       205.0      136.0 19.9      No       Low
5 60.9   Male       207.7      145.4 26.7      No    Medium
6 44.9 Female       222.5      130.6 30.6      No       Low

Now we will use the package TableOne to create our Table 1. First we will load the package and then will create the list of variables which we want to place on Table 1. Secondly, we will define the categorical variables.

#Load package

#Create a variable list which we want in Table 1
listVars <- c("Age", "Gender", "Cholesterol", "SystolicBP", "BMI", "Smoking", 

#Define categorical variables
catVars <- c("Gender","Smoking","Education")

My first interest is to make the Table 1 for total population.

#Total Population
table1 <- CreateTableOne(vars = listVar, data = dt, factorVars = catVar)
  n                          250        
  Age (mean (sd))          57.50 (7.85) 
  Gender = Male (%)          107 (42.8) 
  Cholesterol (mean (sd)) 224.12 (24.90)
  SystolicBP (mean (sd))  145.51 (10.08)
  BMI (mean (sd))          26.79 (4.37) 
  Smoking = Yes (%)           72 (28.8) 
  Education (%)                         
     High                    108 (43.2) 
     Low                      71 (28.4) 
     Medium                   71 (28.4)

But, often I am interested to create Table 1 for men and women and to compare their means and proportions. To compute this we run the code below.

# Removing Gender from list of variables 
listVar <- c("Age", "Cholesterol", "SystolicBP", "BMI", "Smoking", "Education")
table1 <- CreateTableOne(listVars, dt, catVars, strata = c("Gender"))
                         Stratified by Gender
                          Female         Male           p      test
  n                          143            107                    
  Age (mean (sd))          56.94 (8.05)   58.25 (7.55)   0.191     
  Cholesterol (mean (sd)) 224.80 (25.06) 223.21 (24.78)  0.620     
  SystolicBP (mean (sd))  144.95 (10.99) 146.27 (8.71)   0.305     
  BMI (mean (sd))          26.74 (4.58)   26.84 (4.09)   0.859     
  Smoking = Yes (%)           37 (25.9)      35 (32.7)   0.298     
  Education (%)                                          0.289     
     High                     56 (39.2)      52 (48.6)             
     Low                      45 (31.5)      26 (24.3)             
     Medium                   42 (29.4)      29 (27.1) 

You can do a lot more with the TableOne package. For example: you can compute median and inter-quartile range for non normally distributing variables, and run different tests for comparison of the groups.

Export Table 1 from R to Microsoft Word

Now that we have Table 1 ready we want to transfer Table 1 to Microsoft Word document. For this purpose we will use the function FlexTable() from the package "ReporteRs". I found a very good script in StackOverflow to achieve this task. I am sharing the code below. (Credits to the author in StackOverflow).

table1 <- print(table1)

# Load the packages

# The script
docx( ) %>% 
     addFlexTable(table1 %>%
     FlexTable(header.cell.props = cellProperties( background.color = "#003366"),
               header.text.props = textBold( color = "white" ),
               add.rownames = TRUE ) %>%
               setZebraStyle( odd = "#DDDDDD", even = "#FFFFFF" ) ) %>%
     writeDoc(file = "table1.docx")

Finally, you will have the Table 1 ready for submission.
Here the screenshot of my Table 1.

If you have any comment or feedback feel free to post a comment below.

To leave a comment for the author, please follow the link and comment on their blog: DataScience+. offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)