token=keyring::key_get("TALOS_REDCAP_API") ## Primary data set of recorded data inst <- REDCapR::redcap_instruments(redcap_uri = "https://redcap.au.dk/api/",token = token)$data tools <- tolower(c( "PASE", "MFI", "mdi", "mmse", "mrs", "SDMT", "who", "ham", "bi", "grad", "nihss" )) vec_starts_with <- function(d,v){ filt <- paste0("^(", paste(v, collapse="|"), ")") d[grep(filt,d)] } vec_ends_with <- function(d,v){ filt <- paste0("(", paste(v, collapse="|"), ")$") # sub(paste0(".*?_(",paste(v,collapse = "|"),")$"),"\\1",colnames(d)) d[grep(filt,d)] } # vec_starts_with(inst$instrument_name,tools) data <- REDCapR::redcap_read(redcap_uri = "https://redcap.au.dk/api/",token = token, forms = vec_starts_with(inst$instrument_name,tools), fields = "record_id")$data ds <- data |> select(!ends_with("complete")) talos2long <- function(ds,exclude=c("talos","record"),instance_vals=c("0","1","2","4"),exclude_col_ends=c("user","lock")){ nms <- unique(do.call(c,lapply(strsplit(colnames(ds),"_"),"[[",1))) nms <- nms[!nms %in% exclude] ls <- lapply(seq_along(nms),function(i){ cols <- c("record_id",vec_starts_with(colnames(ds),c(paste0("talos_",nms[i]),nms[i]))) d <- select(ds,all_of(cols)) ends <- unique(do.call(c,lapply(strsplit(colnames(d),"_"),function(i){ i[length(i)] }))) ins <- colnames(d) %in% vec_ends_with(colnames(d),paste0("_",instance_vals)) ls_ins <- split.default(d[-1],factor(stRoke::str_extract(colnames(d[ins]),paste0("[",paste(instance_vals,collapse=""),"]$")))) dat <- lapply(seq_along(ls_ins),function(i){ dr <- cbind(d[1],instance=names(ls_ins)[i],ls_ins[[i]]) colnames(dr) <- unique(gsub(pattern = paste0("_[",paste(instance_vals,collapse=""),"]$"),"",colnames(dr))) dr |> select(record_id,contains("_sys_"),instance,everything()) }) |> bind_rows() |> rename(rnumb=record_id) |> mutate(rnumb=as.character(rnumb)) ## Col name ending on 00 is date col of measure in all tools dat[,vec_ends_with(colnames(dat),"00")] <- as.Date(dat[,vec_ends_with(colnames(dat),"00")]) dat |> select(!ends_with(exclude_col_ends)) }) names(ls) <- nms ls } ls_sel <- data |> select(!ends_with("complete"))|> talos2long() ## Data set of baseline and DAP data subjects_raw <- REDCapR::redcap_read( redcap_uri = "https://redcap.au.dk/api/", token = token, forms = vec_starts_with(inst$instrument_name, c("end", "inkl", "reg", "basis")), fields = "record_id" )$data subjects <- subjects_raw |> select( record_id, talos_end00, talos_end01, rdate, rtreat, cpr, basis_kon, starts_with("reg_") ) |> select(!ends_with("complete")) |> rename(rnumb = record_id, enddate = talos_end00, eos_early = talos_end01, sex=basis_kon) |> mutate( enddate = as.Date(enddate), rdate = as.Date(rdate), inc_time = as.numeric(difftime(enddate, rdate, units = "days")), age = stRoke::age_calc(as.Date(stRoke::cpr_dob(cpr,"%Y-%m-%d")),enddate=rdate) ) # colnames(subjects) <- gsub("^reg_","",colnames(subjects))