knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) knitr::opts_knit$set(root.dir = tempdir()) #To re-build all pdf vignettes (only ones that are git checked-in), # copy-paste the code below into console (Ctrl+Enter does not work): #for (fil in list.files(path = "./vignettes/", pattern = ".+Rmd")) {rmarkdown::render(paste0("./vignettes/", fil), rmarkdown::pdf_document(toc = TRUE, toc_depth = 4))} #To re-build all vignettes where the rmd was changed more recently than the pdf # copy-paste the code below into console (Ctrl+Enter does not work): #for (fil in list.files(path = "./vignettes/", pattern = ".+Rmd")) {if(file.info(paste0("./vignettes/", fil))$mtime > file.info(paste0("./vignettes/", sub(x = fil, "\\.Rmd", ".pdf")))$mtime) {rmarkdown::render(paste0("./vignettes/", fil), rmarkdown::pdf_document(toc = TRUE, toc_depth = 4))}} #To do so for all vignettes, copy-paste the code below into console # (Ctrl+Enter does not work): #for (fil in list.files(path = "./vignettes/", pattern = ".+Rmd")) {rmarkdown::render(paste0("./vignettes/", fil), rmarkdown::html_vignette(toc = TRUE, toc_dept = 4)); rmarkdown::render(paste0("./vignettes/", fil), rmarkdown::pdf_document(toc = TRUE, toc_depth = 4)); rmarkdown::render(paste0("./vignettes/", fil), rmarkdown::word_document(toc = TRUE, toc_dept = 4))} # #Get timings for all html builds (copy-paste not Ctrl+Enter) #{filtimes <- data.frame(fil = list.files(path = "./vignettes/", pattern = ".+Rmd")); filtimes$times <- NA; for (filindex in 1:nrow(filtimes)) {fil <- filtimes$fil[filindex]; start <- Sys.time(); rmarkdown::render(paste0("./vignettes/", fil), rmarkdown::html_vignette(toc = TRUE, toc_dept = 4)); filtimes$times[filindex] <- difftime(Sys.time(), start, units = "mins")}; print(filtimes)}
gcplyr
is a package that implements a number of functions to make it easier to import, manipulate, and analyze microbial growth from data collected in multiwell plate readers ("growth curves"). Without gcplyr
, importing and analyzing plate reader data can be a complicated process that has to be tailored for each experiment, requiring many lines of code. With gcplyr
many of those steps are now just a single line of code.
This document gives an introduction of how to use gcplyr
for each step of a growth curve analysis.
To get started, you need your growth curve data file saved to your computer (.csv, .xls, .xlsx, or any other format that can be read by read.table
).
Users often want to combine their data with some information on the experimental design of their plate(s). You can save this information into a tabular file as well, or you can just keep it handy to enter directly in R
(see vignette("gc03_incorporate_designs")
).
Let's get started by loading gcplyr
. We're also going to load a couple other packages we'll need.
library(gcplyr) library(dplyr) library(ggplot2)
gcplyr
Before digging into the details, here's a simple demonstration of what a final gcplyr
script can look like. This script:
Don't worry about understanding all the details of how the code works right now. Each of these steps is explained in depth in later articles.
#For the purposes of this demo, we have to create our example data and # design files. Normally, the data file would be created by a plate reader, and # the design file would be created by you, the user #Generate our example data file, widedata.csv make_example(vignette = 1, example = 1) #Generate our example design files, Bacteria_strain.csv and Phage.csv make_example(vignette = 1, example = 2) # Read in our data data_wide <- read_wides(files = "widedata.csv") # Transform our data to be tidy-shaped data_tidy <- trans_wide_to_tidy(wides = data_wide, id_cols = c("file", "Time")) # Convert our time into hours data_tidy$Time <- as.numeric(data_tidy$Time)/3600 # Import our designs designs <- import_blockdesigns(files = c("Bacteria_strain.csv", "Phage.csv")) # Merge our designs and data data_merged <- merge_dfs(data_tidy, designs) #Set up the Well column so they plot in the correct order data_merged$Well <- factor(data_merged$Well, levels = paste0(rep(LETTERS[1:8], each = 12), 1:12)) #Plot the data ggplot(data = data_merged, aes(x = Time, y = Measurements)) + geom_line() + facet_wrap(~Well, nrow = 8, ncol = 12) # Voila! 8 lines of code and all your data is imported & plotted! # Calculate the per-capita growth rate over time in each well data_merged <- mutate( group_by(data_merged, Well), percap_deriv = calc_deriv(y = Measurements, x = Time, percapita = TRUE, blank = 0, window_width_n = 5)) # Calculate four common metrics of bacterial growth: # the lag time, saving it to a column named lag_time # the maximum growth rate, saving it to a column named max_percap # the maximum density, saving it to a column named max_dens # the area-under-the-curve, saving it to a column named 'auc' data_sum <- summarize( group_by(data_merged, Well, Bacteria_strain, Phage), lag_time = lag_time(x = Time, y = Measurements, deriv = percap_deriv, blank = 0), max_percap = max(percap_deriv, na.rm = TRUE), max_dens = max(Measurements), auc = auc(y = Measurements, x = as.numeric(Time))) # Print some of the values head(data_sum) #Set up the Well column so they plot in the correct order data_sum$Well <- factor(data_sum$Well, levels = paste0(rep(LETTERS[1:8], each = 12), 1:12)) #Plot lag time ggplot(data = data_sum) + geom_text(aes(label = round(lag_time, 2), x = 1, y = 1)) + facet_wrap(~ Well, ncol = 12) + labs(title = "Lag time by well") + theme(axis.title = element_blank(), axis.text = element_blank(), axis.ticks = element_blank()) #Plot growth rate ggplot(data = data_sum) + geom_text(aes(label = round(max_percap, 2), x = 1, y = 1)) + facet_wrap(~ Well, ncol = 12) + labs(title = "Maximum growth rate by well") + theme(axis.title = element_blank(), axis.text = element_blank(), axis.ticks = element_blank()) #Plot Maximum density ggplot(data = data_sum) + geom_text(aes(label = round(max_dens, 2), x = 1, y = 1)) + facet_wrap(~ Well, ncol = 12) + labs(title = "Maximum density by well") + theme(axis.title = element_blank(), axis.text = element_blank(), axis.ticks = element_blank()) #Plot AUC ggplot(data = data_sum) + geom_text(aes(label = round(auc, 2), x = 1, y = 1)) + facet_wrap(~ Well, ncol = 12) + labs(title = "Area under the curve by well") + theme(axis.title = element_blank(), axis.text = element_blank(), axis.ticks = element_blank())
In the example here, we've shown how each step of a gcplyr
workflow is only one or a few lines of code. In the following pages, we've explained each of these steps in depth. To start, we'll learn how to import our data into R
and transform it into a convenient format.
vignette("gc01_gcplyr")
vignette("gc02_import_reshape")
vignette("gc03_incorporate_designs")
vignette("gc04_preprocess_plot")
vignette("gc05_process")
vignette("gc06_analyze")
vignette("gc07_noise")
vignette("gc08_conclusion")
vignette("gc09_multiple_plates")
vignette("gc10_using_make_design")
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.