Processing data from Google form

Description: Takes raw csv file from the Google form and updates it for analysis.

Coder name(s): Althea ArchMiller


Preamble

Load libraries

library(ezknitr)
library(knitr)
library(devtools)

Clear environment and set seed

remove(list=ls())
set.seed(2647)

Load Data

raw_data <- read.csv(file = "data/google_form_data_raw.csv", 
                     stringsAsFactors = F,
                     header = T)
str(raw_data)
## 'data.frame':    101 obs. of  14 variables:
##  $ Timestamp                                                                             : chr  "2018/07/25 1:16:00 PM CDT" "2018/07/25 1:18:47 PM CDT" "2018/07/25 2:29:22 PM CDT" "2018/07/25 3:01:47 PM CDT" ...
##  $ Study.ID..e.g...wsb002.or.jwm040.                                                     : chr  "wsb028" "jwm019" "wsb015" "wsb013" ...
##  $ Reviewer.s.Initials..yours.                                                           : chr  "AAA" "ADJ" "KV" "FI" ...
##  $ Was.this.paper.suitable.for.review..                                                  : chr  "True" "True" "True" "True" ...
##  $ Was.this.paper.reviewed..                                                             : chr  "" "" "" "" ...
##  $ Data.readily.available.                                                               : chr  "False" "True" "False" "True" ...
##  $ Was.the.data.pre.processed.or.shared.in.original.raw.format.                          : chr  "Pre-processed" "Pre-processed" "Pre-processed" "Raw format" ...
##  $ Code.available                                                                        : chr  "True" "True" "Not applicable (e.g., not analyzed with code-based software)" "False" ...
##  $ Analysis.was.entirely.code.based                                                      : chr  "True" "True" "False" "False" ...
##  $ Open.source.file.formats.used.                                                        : chr  "True" "True" "False" "False" ...
##  $ Can.code.be.run.as.is..                                                               : int  5 4 NA NA 5 NA 4 NA NA NA ...
##  $ Were.the.study.s.figures.reproduced..                                                 : int  5 5 3 4 5 3 5 NA NA NA ...
##  $ Were.the.numbers.in.the.study.s.tables.and.or.results.text.quantitatively.reproduced..: int  5 4 2 4 5 3 4 NA NA NA ...
##  $ Were.the.study.s.conclusions.reproduced..                                             : int  5 4 4 5 5 4 4 NA NA NA ...

Fill in missing data

The question “Was this study reviewed?” was added after a few survey responses were filled in, so I will update those records with “TRUE”

View responses to this column

table(raw_data$Was.this.paper.reviewed..)
## 
##                                                                          
##                                                                        6 
## False, author declined to participate (e.g., private data, no time, etc) 
##                                                                       10 
##                                            False, author never responded 
##                                                                       41 
##                                False, for other reasons not stated above 
##                                                                        6 
##                                             False, unsuitable for review 
##                                                                        6 
##                                                                     True 
##                                                                       32

Replace “” with “True”

raw_data$Was.this.paper.reviewed.. <- ifelse(
  test = raw_data$Was.this.paper.reviewed.. == "", 
  yes = "True", 
  no = raw_data$Was.this.paper.reviewed..)

Double check that it worked

table(raw_data$Was.this.paper.reviewed..)
## 
## False, author declined to participate (e.g., private data, no time, etc) 
##                                                                       10 
##                                            False, author never responded 
##                                                                       41 
##                                False, for other reasons not stated above 
##                                                                        6 
##                                             False, unsuitable for review 
##                                                                        6 
##                                                                     True 
##                                                                       38

Why weren't studies reviewed?

Create and fill out a new column for “Why not reviewed”

raw_data$Why.not.reviewed <- NA

Fill in with “NA-Was reviewed” for all reviewed studies:

raw_data$Why.not.reviewed[raw_data$Was.this.paper.reviewed..=="True"] <- "NA: Study was reviewed"

If unsuitable, add this information in:

raw_data$Why.not.reviewed[raw_data$Was.this.paper.reviewed..=="False, unsuitable for review"] <- 
  "Unsuitable for review"

If author never responded, add this information in:

raw_data$Why.not.reviewed[raw_data$Was.this.paper.reviewed..=="False, author never responded"] <- 
  "No correspondence"

In two cases, a study was initially thought to be not reviewed but it was. One example of this was jwm027, where the author was slow to respond, but eventually did send us data. This was classified incorrectly in Google form as “False, author never responded.” I need to remove this specific data point.

new_data <- raw_data[!(raw_data$Study.ID..e.g...wsb002.or.jwm040. == "jwm027" &
                     raw_data$Was.this.paper.reviewed.. == "False, author never responded"),]

In the second case, we had to send in a written proposal to a regulatory agency to get the data. We thought that we would not get the proposal accepted, so we thought that we would be unable to review this project. But, in the end, the proposal was accepted and we reviewed this study. I will need to remove the data point that incorrectly files wsb038 as “False, for other reasons not stated above”

new_data <- new_data[!(new_data$Study.ID..e.g...wsb002.or.jwm040. == "wsb038" &
                         new_data$Was.this.paper.reviewed.. == "False, for other reasons not stated above"),]

Track down reasons for “False, author declined to participate…”

What studies was this true for?

new_data$Study.ID..e.g...wsb002.or.jwm040.[new_data$Was.this.paper.reviewed.. == 
                    "False, author declined to participate (e.g., private data, no time, etc)"]
##  [1] "jwm003" "jwm005" "jwm011" "jwm016" "jwm031" "wsb001" "wsb005"
##  [8] "wsb039" "wsb037" "jwm036"

I want to classify responses:

new_data$Why.not.reviewed <- 
  ifelse(test = 
           new_data$Study.ID..e.g...wsb002.or.jwm040. == "jwm003" |
           new_data$Study.ID..e.g...wsb002.or.jwm040. == "wsb039" |
           new_data$Study.ID..e.g...wsb002.or.jwm040. == "wsb037" |
           new_data$Study.ID..e.g...wsb002.or.jwm040. == "wsb001",
         yes = "Author Declined: Proprietary/confidential data", 
         no = ifelse(test = 
                       new_data$Study.ID..e.g...wsb002.or.jwm040. == "jwm005" |
                       new_data$Study.ID..e.g...wsb002.or.jwm040. == "jwm031",
                     yes = "Author Declined: No reason given",
                     no = ifelse(test = 
                                   new_data$Study.ID..e.g...wsb002.or.jwm040. == "jwm011" |
                                   new_data$Study.ID..e.g...wsb002.or.jwm040. == "wsb005" |
                                   new_data$Study.ID..e.g...wsb002.or.jwm040. == "jwm036",
                                 yes = "Author Declined: Not enough time",
                                 no = ifelse(test = new_data$Study.ID..e.g...wsb002.or.jwm040. == "jwm016",
                                             yes = "Author Declined: Data saved for future article",
                                             no = new_data$Why.not.reviewed))
         ))

Track down reasons for “False, for other reasons not stated above”

What studies was this true for?

new_data$Study.ID..e.g...wsb002.or.jwm040.[new_data$Was.this.paper.reviewed.. ==
                                             "False, for other reasons not stated above"]
## [1] "wsb020" "wsb029" "wsb007" "wsb027" "jwm038"

Classify reasons:

new_data$Why.not.reviewed <- 
  ifelse(test = 
           new_data$Study.ID..e.g...wsb002.or.jwm040. == "wsb020", 
         yes = "Author Declined: Proprietary/confidential data",
         no = ifelse(test = 
                       new_data$Study.ID..e.g...wsb002.or.jwm040. == "wsb029" |
                       new_data$Study.ID..e.g...wsb002.or.jwm040. == "jwm038",
                     yes = "No correspondence",
                     no = ifelse(test = 
                                   new_data$Study.ID..e.g...wsb002.or.jwm040. == "wsb007" |
                                   new_data$Study.ID..e.g...wsb002.or.jwm040. == "wsb027",
                                 yes = "Author wanted to participate, but did not send data",
                                 no = new_data$Why.not.reviewed)))

Look at results

table(new_data$Why.not.reviewed)
## 
##      Author Declined: Data saved for future article 
##                                                   1 
##                    Author Declined: No reason given 
##                                                   2 
##                    Author Declined: Not enough time 
##                                                   3 
##      Author Declined: Proprietary/confidential data 
##                                                   5 
## Author wanted to participate, but did not send data 
##                                                   2 
##                              NA: Study was reviewed 
##                                                  38 
##                                   No correspondence 
##                                                  42 
##                               Unsuitable for review 
##                                                   6
sum(table(new_data$Why.not.reviewed))
## [1] 99

Add in journal column

new_data$journal[grep("jwm", x = new_data$Study.ID..e.g...wsb002.or.jwm040.)] <-
  "JWM"
new_data$journal[grep("wsb", x = new_data$Study.ID..e.g...wsb002.or.jwm040.)] <-
  "WSB"
table(new_data$journal)
## 
## JWM WSB 
##  47  52

Summarize results for studies that were reviewed

There were two reviewers for each reviewed study:

table(new_data$Study.ID..e.g...wsb002.or.jwm040.[new_data$Was.this.paper.reviewed..=="True"])
## 
## jwm004 jwm010 jwm019 jwm022 jwm024 jwm027 jwm028 wsb004 wsb006 wsb008 
##      2      2      2      2      2      2      2      2      2      2 
## wsb010 wsb013 wsb014 wsb015 wsb018 wsb023 wsb028 wsb035 wsb038 
##      2      2      2      2      2      2      2      2      2

So, we need to average the scores to the questions:

Subset data to reviewed studies only and check for missing data, where there should be data:

reviewed_data <- new_data[new_data$Was.this.paper.reviewed..=="True",]
summary(reviewed_data$Were.the.study.s.figures.reproduced..)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##   1.000   1.750   4.000   3.361   5.000   5.000       2
summary(reviewed_data$Were.the.numbers.in.the.study.s.tables.and.or.results.text.quantitatively.reproduced..)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##   1.000   2.000   4.000   3.297   4.000   5.000       1
summary(reviewed_data$Were.the.study.s.conclusions.reproduced..)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##   1.000   3.000   4.000   3.703   5.000   5.000       1

For one of these studies with NAs, there were no figures, so I will replace with a “99”

reviewed_data$Were.the.study.s.figures.reproduced..[
  reviewed_data$Study.ID..e.g...wsb002.or.jwm040. == "wsb018"] <- 99

For another of these studies, the study was completely unreproducible, so the reviewer erroneously didn't answer these questions. These should have been “1s”

reviewed_data$Were.the.study.s.figures.reproduced..[
  reviewed_data$Study.ID..e.g...wsb002.or.jwm040. == "wsb008"] <- 1
reviewed_data$Were.the.numbers.in.the.study.s.tables.and.or.results.text.quantitatively.reproduced..[
  reviewed_data$Study.ID..e.g...wsb002.or.jwm040. == "wsb008"] <- 1
reviewed_data$Were.the.study.s.conclusions.reproduced..[
  reviewed_data$Study.ID..e.g...wsb002.or.jwm040. == "wsb008"] <- 1

Summarize information by reviewed study with a for-loop

study_names <- unique(reviewed_data$Study.ID..e.g...wsb002.or.jwm040.)
for(ss in 1:length(study_names)){
  subsetdata <- reviewed_data[reviewed_data$Study.ID..e.g...wsb002.or.jwm040.==study_names[ss],]

  # Check for disagreements amongst answers
  if(length(unique(subsetdata[,"Data.readily.available."]))>=2){
    print(paste(study_names[ss], "error: data readily available"))
  }
  if(length(unique(subsetdata[,"Was.the.data.pre.processed.or.shared.in.original.raw.format." ]))>=2){
    print(paste(study_names[ss], "error: was data pre processed"))
  }
  if(length(unique(subsetdata[,"Code.available" ]))>=2){
    print(paste(study_names[ss], "error: code available"))
  }
  if(length(unique(subsetdata[,"Analysis.was.entirely.code.based" ]))>=2){
    print(paste(study_names[ss], "error: was analysis code based"))
  }
  if(length(unique(subsetdata[,"Can.code.be.run.as.is.." ]))>=2){
    print(paste(study_names[ss], "error: Can.code.be.run.as.is.."))
  }
  if(length(unique(subsetdata[,"Open.source.file.formats.used." ]))>=2){
    print(paste(study_names[ss], "error: open source formats"))
  }
}
## [1] "wsb028 error: data readily available"
## [1] "jwm019 error: open source formats"
## [1] "wsb013 error: code available"
## [1] "wsb013 error: open source formats"
## [1] "wsb035 error: data readily available"
## [1] "wsb035 error: was analysis code based"
## [1] "wsb004 error: was data pre processed"
## [1] "jwm010 error: was data pre processed"
## [1] "jwm010 error: was analysis code based"
## [1] "jwm010 error: Can.code.be.run.as.is.."
## [1] "wsb018 error: data readily available"
## [1] "wsb018 error: open source formats"
## [1] "wsb006 error: data readily available"
## [1] "wsb006 error: was data pre processed"
## [1] "wsb006 error: was analysis code based"
## [1] "wsb006 error: Can.code.be.run.as.is.."
## [1] "wsb006 error: open source formats"
## [1] "wsb023 error: was analysis code based"
## [1] "wsb010 error: was data pre processed"
## [1] "wsb010 error: Can.code.be.run.as.is.."
## [1] "wsb010 error: open source formats"
## [1] "wsb014 error: data readily available"
## [1] "wsb014 error: code available"
## [1] "wsb014 error: open source formats"
## [1] "jwm022 error: data readily available"
## [1] "jwm022 error: was data pre processed"
## [1] "jwm022 error: code available"
## [1] "jwm022 error: Can.code.be.run.as.is.."
## [1] "wsb008 error: data readily available"
## [1] "wsb008 error: code available"
## [1] "wsb008 error: Can.code.be.run.as.is.."
## [1] "jwm024 error: was analysis code based"
## [1] "jwm024 error: Can.code.be.run.as.is.."
## [1] "jwm028 error: was data pre processed"
## [1] "jwm028 error: was analysis code based"
## [1] "jwm028 error: Can.code.be.run.as.is.."
## [1] "jwm004 error: open source formats"
## [1] "wsb038 error: Can.code.be.run.as.is.."
## [1] "jwm027 error: open source formats"

Fix anomolies listed above:

1. Data was readily available

Data was sent by author so “was data readily available” should be “False”

True for: wsb028, wsb018, wsb006, wsb014, wsb008

Data was available in paper, so “was data readily available” should be “True”

True for: wsb035, jwm022

reviewed_data$Data.readily.available. <- ifelse(
  test = reviewed_data$Study.ID..e.g...wsb002.or.jwm040. == "wsb028" |
    reviewed_data$Study.ID..e.g...wsb002.or.jwm040. == "wsb018" |
    reviewed_data$Study.ID..e.g...wsb002.or.jwm040. == "wsb006" |
    reviewed_data$Study.ID..e.g...wsb002.or.jwm040. == "wsb014" |
    reviewed_data$Study.ID..e.g...wsb002.or.jwm040. == "wsb008",
  yes = "False",
  no = ifelse(
    test = reviewed_data$Study.ID..e.g...wsb002.or.jwm040. == "wsb035" |
      reviewed_data$Study.ID..e.g...wsb002.or.jwm040. == "jwm022",
    yes = "True",
    no = reviewed_data$Data.readily.available.
  )
)

2. Was code available?

For jwm022 and wsb008, code actually was available

For wsb013 and wsb014, analysis was not code-based so should be “Not applicable..”

reviewed_data$Code.available <- ifelse(
  test = reviewed_data$Study.ID..e.g...wsb002.or.jwm040. == "jwm022" |
    reviewed_data$Study.ID..e.g...wsb002.or.jwm040. == "wsb008",
  yes = "True",
  no = ifelse(
    test = reviewed_data$Study.ID..e.g...wsb002.or.jwm040. == "wsb013" |
      reviewed_data$Study.ID..e.g...wsb002.or.jwm040. == "wsb014",
    yes = "Not applicable (e.g., not analyzed with code-based software)",
    no = reviewed_data$Code.available
  ))

3. Analysis was entirely code based

Actually true for wsb035, jwm010, wsb006, wsb023, jwm024 and jwm028

reviewed_data$Analysis.was.entirely.code.based <- ifelse(
  test = reviewed_data$Study.ID..e.g...wsb002.or.jwm040. == "wsb035" |
    reviewed_data$Study.ID..e.g...wsb002.or.jwm040. == "jwm010" |
    reviewed_data$Study.ID..e.g...wsb002.or.jwm040. == "wsb006" |
    reviewed_data$Study.ID..e.g...wsb002.or.jwm040. == "wsb023" |
    reviewed_data$Study.ID..e.g...wsb002.or.jwm040. == "jwm024" |
    reviewed_data$Study.ID..e.g...wsb002.or.jwm040. == "jwm028",
  yes = "True",
  no = reviewed_data$Analysis.was.entirely.code.based)

4. Data was pre-processed

True for wsb004 and wsb010, but raw data for jwm010, wsb006, jwm022

reviewed_data$Was.the.data.pre.processed.or.shared.in.original.raw.format. <- ifelse(
  test = reviewed_data$Study.ID..e.g...wsb002.or.jwm040. == "wsb004" |
    reviewed_data$Study.ID..e.g...wsb002.or.jwm040. == "wsb010" |
    reviewed_data$Study.ID..e.g...wsb002.or.jwm040. == "jwm028",
  yes = "Pre-processed",
  no = ifelse(
    test = reviewed_data$Study.ID..e.g...wsb002.or.jwm040. == "jwm010" |
      reviewed_data$Study.ID..e.g...wsb002.or.jwm040. == "wsb006" |
      reviewed_data$Study.ID..e.g...wsb002.or.jwm040. == "jwm022",
    yes = "Raw format",
    no = reviewed_data$Was.the.data.pre.processed.or.shared.in.original.raw.format.
  ))

5. Can code be run as is?

Make sure this is “NA” for studies without code provided

reviewed_data$Can.code.be.run.as.is..[reviewed_data$Code.available=="False"] <- NA

For jwm022, the code could be run as-is, but this was mistakenly not completed on survey:

reviewed_data$Can.code.be.run.as.is..[reviewed_data$Study.ID..e.g...wsb002.or.jwm040.=="jwm022"] <- 5

The rest are just from where there are slight ranking changes between both reviewers, so they'll be averaged out in the next step

6. Update whether open source formats were used

Studies jwm019, wsb006, wsb010, wsb014, jwm027 used open source formats like csv, R, unmarked, etc.

Studies wsb013, wsb018, jwm004 used proprietary formats like JMP, ArcGIS, and Excel

open <-  c("jwm019", "wsb006", "wsb010", "wsb014", "jwm027")
proprietary <- c("wsb013", "wsb018", "jwm004")

Update discrepancies

reviewed_data$Open.source.file.formats.used.[
  reviewed_data$Study.ID..e.g...wsb002.or.jwm040. %in% open] <- 
  "True"
reviewed_data$Open.source.file.formats.used.[
  reviewed_data$Study.ID..e.g...wsb002.or.jwm040. %in% proprietary] <- 
  "False"

Average numerical results and simultaneously check for errors

New dataset for averaged data

averages <- 
  as.data.frame(matrix(NA, ncol = 6, nrow = length(study_names)))
colnames(averages) <- 
  c("studyID", "graphsReproduced", "numbersReproduced", 
    "conclusionsReproduced", "codeRunsAsIs", "journal")
for(ss in 1:length(study_names)){
  subsetdata <- 
    reviewed_data[reviewed_data$Study.ID..e.g...wsb002.or.jwm040.==study_names[ss],]

  # Check for disagreements amongst answers
  if(length(unique(subsetdata[,"Data.readily.available."]))>=2){
    print(paste(study_names[ss], "error: data readily available"))
  }
  if(length(unique(subsetdata[
    ,"Was.the.data.pre.processed.or.shared.in.original.raw.format." ]))>=2){
    print(paste(study_names[ss], "error: was data pre processed"))
  }
  if(length(unique(subsetdata[,"Code.available" ]))>=2){
    print(paste(study_names[ss], "error: code available"))
  }
  if(length(unique(subsetdata[,"Analysis.was.entirely.code.based" ]))>=2){
    print(paste(study_names[ss], "error: was analysis code based"))
  }

  # Average over numerical responses
  averages$studyID[ss] <- study_names[ss]
  averages$graphsReproduced[ss] <- 
    ifelse(study_names[ss] == "wsb018",
           yes = NA,
           no = mean(subsetdata$Were.the.study.s.figures.reproduced.., na.rm = T))
  averages$numbersReproduced[ss] <- 
    mean(subsetdata$Were.the.numbers.in.the.study.s.tables.and.or.results.text.quantitatively.reproduced..)
  averages$conclusionsReproduced[ss] <- 
    mean(subsetdata$Were.the.study.s.conclusions.reproduced..)
  averages$codeRunsAsIs[ss] <- mean(subsetdata$Can.code.be.run.as.is..)

  averages$journal[ss] <- subsetdata$journal[1]

  averages$dataAvailable[ss] <- subsetdata$Data.readily.available.[1]
  averages$preProcessed[ss] <- 
    subsetdata$Was.the.data.pre.processed.or.shared.in.original.raw.format.[1]
  averages$codeBased[ss] <- subsetdata$Analysis.was.entirely.code.based[1]
  averages$codeAvailable[ss] <- subsetdata$Code.available[1]
  averages$openSource[ss] <- subsetdata$Open.source.file.formats.used.[1]
}

Do results look right?

summary(averages)
##    studyID          graphsReproduced numbersReproduced
##  Length:19          Min.   :1.000    Min.   :1.000    
##  Class :character   1st Qu.:1.750    1st Qu.:2.000    
##  Mode  :character   Median :3.500    Median :4.000    
##                     Mean   :3.278    Mean   :3.237    
##                     3rd Qu.:4.875    3rd Qu.:4.000    
##                     Max.   :5.000    Max.   :5.000    
##                     NA's   :1                         
##  conclusionsReproduced  codeRunsAsIs     journal         
##  Min.   :1.000         Min.   :2.000   Length:19         
##  1st Qu.:2.250         1st Qu.:3.000   Class :character  
##  Median :4.500         Median :3.750   Mode  :character  
##  Mean   :3.632         Mean   :3.650                     
##  3rd Qu.:5.000         3rd Qu.:4.375                     
##  Max.   :5.000         Max.   :5.000                     
##                        NA's   :9                         
##  dataAvailable      preProcessed        codeBased        
##  Length:19          Length:19          Length:19         
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character  
##                                                          
##                                                          
##                                                          
##                                                          
##  codeAvailable       openSource       
##  Length:19          Length:19         
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
##                                       
## 

If it was not code based, then codeAvailable should equal NA

averages$codeAvailable[averages$codeBased=="False"] <- NA

For wsb035, there are a few categories that do not apply, because it was a primarily simulated dataset, so they'll be converted to NA

averages$openSource[averages$studyID=="wsb035"] <- NA
averages$preProcessed[averages$studyID=="wsb035"] <- NA
averages$dataAvailable[averages$studyID=="wsb035"] <- NA
averages$codeBased[averages$studyID=="wsb035"] <- NA

Save Data

save(averages, file = "data/processed_data/averages_of_reviewed_studies.Rdata")
save(reviewed_data, file = "data/processed_data/reviewed_studies_data.Rdata")
save(new_data, file = "data/processed_data/all_studies_data.Rdata")

Footer

devtools::session_info()
## - Session info ----------------------------------------------------------
##  setting  value                       
##  version  R version 3.4.3 (2017-11-30)
##  os       Windows >= 8 x64            
##  system   x86_64, mingw32             
##  ui       RStudio                     
##  language (EN)                        
##  collate  English_United States.1252  
##  ctype    English_United States.1252  
##  tz       America/Chicago             
##  date     2019-06-03                  
## 
## - Packages --------------------------------------------------------------
##  package     * version date       lib source        
##  assertthat    0.2.0   2017-04-11 [1] CRAN (R 3.4.4)
##  backports     1.1.2   2017-12-13 [1] CRAN (R 3.4.4)
##  bindr         0.1.1   2018-03-13 [1] CRAN (R 3.4.4)
##  bindrcpp      0.2.2   2018-03-29 [1] CRAN (R 3.4.4)
##  callr         3.1.0   2018-12-10 [1] CRAN (R 3.4.4)
##  cli           1.0.1   2018-09-25 [1] CRAN (R 3.4.4)
##  colorspace    1.3-2   2016-12-14 [1] CRAN (R 3.4.4)
##  crayon        1.3.4   2017-09-16 [1] CRAN (R 3.4.4)
##  desc          1.2.0   2018-05-01 [1] CRAN (R 3.4.4)
##  devtools    * 2.0.1   2018-10-26 [1] CRAN (R 3.4.4)
##  digest        0.6.18  2018-10-10 [1] CRAN (R 3.4.4)
##  dplyr         0.7.8   2018-11-10 [1] CRAN (R 3.4.4)
##  evaluate      0.12    2018-10-09 [1] CRAN (R 3.4.4)
##  ezknitr     * 0.6     2016-09-16 [1] CRAN (R 3.4.4)
##  fs            1.2.6   2018-08-23 [1] CRAN (R 3.4.4)
##  ggplot2     * 3.1.0   2018-10-25 [1] CRAN (R 3.4.4)
##  glue          1.3.0   2018-07-17 [1] CRAN (R 3.4.4)
##  gtable        0.2.0   2016-02-26 [1] CRAN (R 3.4.4)
##  highr         0.7     2018-06-09 [1] CRAN (R 3.4.4)
##  knitr       * 1.21    2018-12-10 [1] CRAN (R 3.4.4)
##  labeling      0.3     2014-08-23 [1] CRAN (R 3.4.1)
##  lazyeval      0.2.1   2017-10-29 [1] CRAN (R 3.4.4)
##  magrittr      1.5     2014-11-22 [1] CRAN (R 3.4.3)
##  markdown      0.9     2018-12-07 [1] CRAN (R 3.4.4)
##  memoise       1.1.0   2017-04-21 [1] CRAN (R 3.4.4)
##  mime          0.6     2018-10-05 [1] CRAN (R 3.4.4)
##  munsell       0.5.0   2018-06-12 [1] CRAN (R 3.4.4)
##  pillar        1.3.0   2018-07-14 [1] CRAN (R 3.4.4)
##  pkgbuild      1.0.2   2018-10-16 [1] CRAN (R 3.4.4)
##  pkgconfig     2.0.2   2018-08-16 [1] CRAN (R 3.4.4)
##  pkgload       1.0.2   2018-10-29 [1] CRAN (R 3.4.4)
##  plyr          1.8.4   2016-06-08 [1] CRAN (R 3.4.4)
##  prettyunits   1.0.2   2015-07-13 [1] CRAN (R 3.4.4)
##  processx      3.2.1   2018-12-05 [1] CRAN (R 3.4.4)
##  ps            1.2.1   2018-11-06 [1] CRAN (R 3.4.4)
##  purrr         0.2.5   2018-05-29 [1] CRAN (R 3.4.4)
##  R.methodsS3   1.7.1   2016-02-16 [1] CRAN (R 3.4.1)
##  R.oo          1.22.0  2018-04-22 [1] CRAN (R 3.4.4)
##  R.utils       2.7.0   2018-08-27 [1] CRAN (R 3.4.4)
##  R6            2.3.0   2018-10-04 [1] CRAN (R 3.4.4)
##  Rcpp          1.0.0   2018-11-07 [1] CRAN (R 3.4.4)
##  remotes       2.0.2   2018-10-30 [1] CRAN (R 3.4.4)
##  rlang         0.3.0.1 2018-10-25 [1] CRAN (R 3.4.4)
##  rprojroot     1.3-2   2018-01-03 [1] CRAN (R 3.4.4)
##  scales        1.0.0   2018-08-09 [1] CRAN (R 3.4.4)
##  sessioninfo   1.1.1   2018-11-05 [1] CRAN (R 3.4.4)
##  stringi       1.2.4   2018-07-20 [1] CRAN (R 3.4.4)
##  stringr       1.3.1   2018-05-10 [1] CRAN (R 3.4.4)
##  testthat      2.0.1   2018-10-13 [1] CRAN (R 3.4.4)
##  tibble        1.4.2   2018-01-22 [1] CRAN (R 3.4.4)
##  tidyselect    0.2.5   2018-10-11 [1] CRAN (R 3.4.4)
##  usethis     * 1.4.0   2018-08-14 [1] CRAN (R 3.4.4)
##  withr         2.1.2   2018-03-15 [1] CRAN (R 3.4.4)
##  xfun          0.4     2018-10-23 [1] CRAN (R 3.4.4)
##  yaml          2.2.0   2018-07-25 [1] CRAN (R 3.4.4)
## 
## [1] C:/Users/aarchmil/Documents/R/win-library/3.4
## [2] C:/Program Files/R/R-3.4.3/library

spun with: ezknitr::ezspin(file = “programs/01_data_processing.R”, keep_md = FALSE, out_dir = “html_reports”, fig_dir = “figures”)