From 94eb3db7968ec9c096a7ae0d3a735ce9f30afe91 Mon Sep 17 00:00:00 2001 From: Thomas OBADIA <thomas.obadia@pasteur.fr> Date: Thu, 22 May 2025 17:01:11 +0200 Subject: [PATCH] Make casting for REDCAP system variables explicit to address changes in the redcapAPI methods --- ...NTERVENTIONAL_M0_01_dump_REDCap_database.R | 33 ++++++++++++------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/03_INTERVENTIONAL_M0/INTERVENTIONAL_M0_01_dump_REDCap_database.R b/03_INTERVENTIONAL_M0/INTERVENTIONAL_M0_01_dump_REDCap_database.R index 3740ebc..6e9f665 100644 --- a/03_INTERVENTIONAL_M0/INTERVENTIONAL_M0_01_dump_REDCap_database.R +++ b/03_INTERVENTIONAL_M0/INTERVENTIONAL_M0_01_dump_REDCap_database.R @@ -17,6 +17,7 @@ ### SOURCE THE R ENVIRONMENT ###################################################################### source("./03_INTERVENTIONAL_M0/INTERVENTIONAL_M0_00_R_environment.R") +source("./03_INTERVENTIONAL_M0/INTERVENTIONAL_M0_00_R_functions.R") @@ -51,15 +52,15 @@ if (DATA_SOURCE_REDCAP_AHRI_INT_M0) { # Passive Case Detection datasets if (DATA_SOURCE_REDCAP_IPP_INT_PCD) { RCON_IPP_INTERVENTIONAL_PCD <- redcapAPI::redcapConnection(url = Sys.getenv("REDCAP_IPP_API_URL"), - token = Sys.getenv("REDCAP_IPP_API_TOKEN_INTERVENTIONAL_PCD")) + token = Sys.getenv("REDCAP_IPP_API_TOKEN_INTERVENTIONAL_PCD")) } if (DATA_SOURCE_REDCAP_IPM_INT_PCD) { RCON_IPM_INTERVENTIONAL_PCD <- redcapAPI::redcapConnection(url = Sys.getenv("REDCAP_IPM_API_URL"), - token = Sys.getenv("REDCAP_IPM_API_TOKEN_INTERVENTIONAL_PCD")) + token = Sys.getenv("REDCAP_IPM_API_TOKEN_INTERVENTIONAL_PCD")) } if (DATA_SOURCE_REDCAP_AHRI_INT_PCD) { RCON_AHRI_INTERVENTIONAL_PCD <- redcapAPI::redcapConnection(url = Sys.getenv("REDCAP_AHRI_API_URL"), - token = Sys.getenv("REDCAP_AHRI_API_TOKEN_INTERVENTIONAL_PCD")) + token = Sys.getenv("REDCAP_AHRI_API_TOKEN_INTERVENTIONAL_PCD")) } @@ -105,26 +106,36 @@ if (!DATA_EXTRACT_IS_RECENT_INT_M0) { # Radio buttons reported as label instead of code "radio" = castLabelCharacter, "yesno" = castLabelCharacter, - "dropdown" = castLabelCharacter + "dropdown" = castLabelCharacter, + "system" = castLabelCharacter )) %>% # Convert the '999' code to NA, except in Date/POSIX fields because it'll mess them up mutate(across(-c(where(is.POSIXt), - where(is.Date)), function(x) (ifelse(x == 999, NA, x)))) %>% + where(is.Date)), function(x) (ifelse(as.character(x) == "999", NA, x)))) %>% # Add data source for convenience mutate(data_source = RCON) ## Check for invalid records before moving on print(reviewInvalidRecords(dat_interventional_m0_raw[[RCON]])) + + ## Propagate baseline data to subsequent events + dat_interventional_m0_raw[[RCON]] <- propagate_unique_data(x = dat_interventional_m0_raw[[RCON]], + metadata = RCON_INTERVENTIONAL_M0[[RCON]]$metadata(), + events.from = c("participant_screening", + "eligibility_consent", + "identification_demographics", + "safety_of_study_drugs", + "final_status")) } - # Cleanup that loop - rm(RCON) - # Concatenate all data into a single table dat_interventional_m0_raw <- dat_interventional_m0_raw %>% - bind_rows() + bind_rows() + + # Cleanup that loop + rm(RCON) ## Passive Case Detection datasets for (RCON in names(RCON_INTERVENTIONAL_PCD)) { @@ -138,7 +149,8 @@ if (!DATA_EXTRACT_IS_RECENT_INT_M0) { # Radio buttons reported as label instead of code "radio" = castLabelCharacter, "yesno" = castLabelCharacter, - "dropdown" = castLabelCharacter + "dropdown" = castLabelCharacter, + "system" = castLabelCharacter )) %>% # Convert the '999' code to NA, except in Date/POSIX fields because it'll mess them up @@ -228,4 +240,3 @@ rm(INTERVENTIONAL_M0_OUT_01_FILENAME, DATA_EXTRACT_IS_RECENT_INT_M0 <- as.logical(difftime(time1 = Sys.Date(), time2 = as.Date(ifelse(exists("DATA_EXTRACT_TS_INT_M0"), DATA_EXTRACT_TS_INT_M0, DATA_EXTRACT_TS_DEFAULT)), units = "days") <= DATA_EXTRACT_EXPIRY_TIME_D) - -- GitLab