REDCap Data
We use the API to download redcap data to csv and RData files that can easily be ingested by other scripts.
This is done automatically by Cron on Rhea (linux server) (as foranw@rhea)
/Volumes/Hera/Projects/Habit/behave/redcap/00_get.R→data/habit_redcap.csv:/Volumes/Hera/Projects/SPA/scripts/redcap/00_get.R→spa_redcap.RData
Data Shape
As exported, data is in “fake wide” format. Rows are repeated by event (`behave`,`mr`,`behave_2`, `mr_2`, etc) but columns exist for all field labels for all events.
For instance, recuit_age is only presented during recruit, so it is NA for all other redcap_event_names
| record_id | redcap_event_name | recruit_age | enroll_date | demo_age | ptx_mp2rage_onset |
|---|---|---|---|---|---|
| 11751 | recruit_arm_1 | 23 | |||
| 11751 | screener_arm_1 | ||||
| 11751 | behavioral_arm_1 | 2023-12-06 | |||
| 11751 | mr_arm_1 | 2023-12-08 09:06:00 |
To make truly wide, subset columns for each event name of interest and merge back. Example pulled from /Volumes/Hera/Projects/SPA/scripts/redcap/age_visit_histogram.R
# remove '_arm_1' parse visit number from event name
rm_arm <- function(d)
d |> mutate(redcap_event_name=gsub('_arm_1','',redcap_event_name),
visitno=str_extract(redcap_event_name, '[0-9]$'),
visitno=ifelse(is.na(visitno), 1, visitno))
d.behave <- lunas |>
select(luna=record_id, redcap_event_name,
age=demo_age, behave=behave_starttime) |>
filter(!is.na(behave)) |>
rm_arm()
d.mri <- lunas |>
select(luna=record_id, redcap_event_name,
ptx=ptx_mp2rage_onset)|>
filter(!is.na(ptx)) |>
rm_arm()
d_wide <- left_join(d.behave, d.mri, by=c("luna","visitno"))
d_wide |>
rename_with(\(x) gsub('redcap_event_name','name', x)) |>
filter(luna %in% c(11751,11823))
| luna | name.x | age | behave | visitno | name.y | ptx |
|---|---|---|---|---|---|---|
| 11751 | behavioral | 2023-12-06 08:21:39 | 1 | mr | 2023-12-08 09:06:00 | |
| 11823 | behavioral | 13 | 2024-08-09 14:51:18 | 1 |