====== 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 [[:tools:cron]] on [[:admin:it:rhea]] (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_name''s ^ 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 | | |