DataScience+ An online community for showcasing R & Python tutorials. It operates as a networking platform for data scientists to promote their talent and get hired. Our mission is to empower data scientists by bridging the gap between talent and opportunity.

Table 1 and the Characteristics of Study Population

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 I will use the package TableOne to create the Table 1. First I will load the package and then will create the list of variables which I want to place on Table 1. Secondly, I 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 = listVars, data = dt, factorVars = catVars)
  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 I run the code below.

# Removing Gender from list of variables 
listVars <- 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 I have Table 1 ready I want to transfer Table 1 to Microsoft Word document. For this purpose I 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.