DARTER — Projekt 708421
Projektspecifik vejledning til BS & Demens-kohortestudiet
DARTER — Diabetes And inteRgenerational Transmission of hEalth determinants over the life couRse (projekt 708421).
Denne sektion er kun for dem der arbejder på DARTER-projektet. Indholdet her bygger ovenpå den generelle DST-vejledning og tilføjer det projekt-specifikke.
Søgbar variabel- og registeroversigt for DARTER Alle variable og registre der er ansøgt i projektet er samlet i en søgbar tabel: steno-aarhus.github.io/darter-project →
Ny på projektet? Start med den generelle vejledning og vend tilbage hertil: → Fase 1 — Planlæg dit studie → Fase 2 — R: det allermest nødvendige → Fase 3 — Log ind på DST
Praktisk introduktion fra projektet selv I Lukes mappe på serveren finder du en grundig vejledning til at arbejde med data på DST skrevet specifikt til dette projekt:
E:/workdata/708421/workspaces/luke/dstDataPrep/
Find .qmd-filen i denne mappe — den gennemgår dstDataPrep, load_database() og det praktiske workflow på DARTER trin for trin med rigtige eksempler fra projektet. God supplerende læsning til denne vejledning.
I denne sektion
| Side | Indhold |
|---|---|
| Denne side | Setup (dstDataPrep + duckplyr) og en genanvendelig LPR-udtræksfunktion |
| Registersti og datastores | Bekræftede stier og adgangsmetoder til alle registre på 708421 |
| DARTER-specifikke faldgruber | Quirks der er specifikke for dette projekt |
Initielle setup-trin for DARTER
To trin skal gennemføres inden du skriver kode på DARTER:
Trin 1 — Byg dstDataPrep
dstDataPrep er den pakke, der giver adgang til load_database() og alle registerdata. Den skal bygges manuelt, da DST-serveren nulstiller installerede pakker.
- File → Open Project in New Session
- Naviger til
E:/workdata/708421/workspaces/luke/dstDataPrep/dstDataPrep.Rproj - Tryk Ctrl+Shift+B (Build) — eller på Mac via menuen: Build → Install Package
- Vent på “Done” og luk sessionen
Gør det igen hvis library(dstDataPrep) melder Error: there is no package called 'dstDataPrep'.
Trin 2 — Geninstaller duckplyr i starten af hver session
install.packages("duckplyr") # kør inden library() — nulstilles ved logoutAlternativ: brug compute() til DuckDB-forbindelse load_database() returnerer en Arrow-forbindelse der kun understøtter et subset af dplyr-funktioner. Har du brug for DuckDB-specifik funktionalitet eller oplever du langsom ydeevne, kan du pipe til compute():
lmdb <- load_database("lmdb") %>%
filter(pnr %in% !!kohort$pnr) %>% # filtrer i Arrow FØR compute — reducer data
compute() # konvertér til DuckDB-forbindelseReducer altid data med filter()/select() inden compute(). Se osdc-dokumentationen for DuckDB-konfiguration og memory limits.
Inden du kører et script: kontroller at path_output øverst i hvert script peger på din workspace-mappe.
Anbefaling: lav en hjælpefunktion til LPR-udtræk
LPR-udtræk kræver at du kombinerer LPR2 somatisk, LPR2 psykiatrisk og LPR3 — og gør det samme for hvert nyt udfald i projektet. Det betaler sig at samle dette i én genanvendelig funktion fremfor at kopiere koden gentagne gange.
Fordele: - Ét sted at rette, hvis noget ændres (fx et nyt register eller en ny kolonne) - Kodeblokken til hvert udfald reduceres fra ~40 linjer til ét funktionskald - Fejl introduceres ét sted i stedet for i hver kopi
Sådan laver du funktionen — definer den øverst i dit script eller i en separat functions.R-fil:
Se den fulde get_lpr_diagnoses()-funktion
library(dstDataPrep)
library(dplyr)
get_lpr_diagnoses <- function(pnr_vector, diagtypes = c("A", "B"), inpatient_only = FALSE) {
# Åbn registre
lpr_adm <- load_database("lpr_adm") %>% rename_with(tolower) # LPR2 somatisk kontakter
lpr_diag <- load_database("lpr_diag") %>% rename_with(tolower) # LPR2 somatisk diagnoser
psyk_adm <- load_database("t_psyk_adm") %>% rename_with(tolower) %>%
rename(pnr = v_cpr, recnum = k_recnum) # LPR2 psykiatrisk kontakter
psyk_diag <- load_database("t_psyk_diag") %>% rename_with(tolower) %>%
rename(recnum = v_recnum) # LPR2 psykiatrisk diagnoser
lpr3_k <- load_database("lpr_a_kontakt") %>% rename_with(tolower) %>%
filter(lprindberetningssystem == "LPR3") # KRITISK: undgå duplikerede rækker fra LPR_F-format
lpr3_d <- load_database("lpr_a_diagnose") %>% rename_with(tolower) # LPR3 diagnoser
# Filtrer på indlæggelsestype hvis ønsket
if (inpatient_only) {
lpr_adm <- lpr_adm %>% filter(c_pattype == "0") # "0" = indlagt i LPR2
lpr3_k <- lpr3_k %>% filter(kont_type == "ALCA00") # "ALCA00" = indlagt i LPR3
}
# LPR2 somatisk
lpr2_dx <- lpr_adm %>%
filter(pnr %in% !!pnr_vector) %>%
select(pnr, recnum, date_contact = d_inddto) %>%
inner_join(
lpr_diag %>% filter(c_diagtype %in% !!diagtypes) %>% select(recnum, c_diag),
by = "recnum"
) %>%
collect() %>%
mutate(icd3 = substr(c_diag, 2, 4)) # strip D-præfiks
# LPR2 psykiatrisk
lpr2_psyk_dx <- psyk_adm %>%
filter(pnr %in% !!pnr_vector) %>%
select(pnr, recnum, date_contact = d_inddto) %>%
inner_join(
psyk_diag %>% filter(c_diagtype %in% !!diagtypes) %>% select(recnum, c_diag),
by = "recnum"
) %>%
collect() %>%
mutate(icd3 = substr(c_diag, 2, 4))
# LPR3
lpr3_dx <- lpr3_k %>%
filter(pnr %in% !!pnr_vector) %>%
select(pnr, dw_ek_kontakt, date_contact = kont_starttidspunkt) %>%
inner_join(
lpr3_d %>%
filter(diag_kode_type %in% !!diagtypes,
is.na(senere_afkraeftet) | senere_afkraeftet != "Ja") %>%
select(dw_ek_kontakt, c_diag = diag_kode),
by = "dw_ek_kontakt"
) %>%
collect() %>%
mutate(date_contact = as.Date(date_contact), # datetime → dato
icd3 = substr(c_diag, 2, 4))
bind_rows(lpr2_dx, lpr2_psyk_dx, lpr3_dx) # returner samlet tabel
}
Brug funktionen — ét kald pr. udtræk, skift kun KODER
kohort <- readRDS("datasets/full_cohort.rds")
pnr_liste <- unique(kohort$pnr)
# Hent alle diagnoser for kohorten (Fase 1 — se hospitalskontakter-siden)
alle_dx <- get_lpr_diagnoses(
pnr_vector = pnr_liste,
diagtypes = c("A", "B"),
inpatient_only = FALSE
)
# Returnerer: pnr | date_contact | c_diag | icd3
# Udtræk ét udfald — skift kun KODER (Fase 2)
KODER <- c("F00", "F01", "F02", "F03", "G30", "G31") # demens
demens <- alle_dx %>%
filter(icd3 %in% KODER) %>%
inner_join(kohort %>% select(pnr, index_date), by = "pnr") %>%
filter(date_contact > index_date) %>%
group_by(pnr) %>% arrange(date_contact) %>% slice(1) %>% ungroup() %>%
select(pnr, demens_dato = date_contact)
resultat <- kohort %>% select(pnr) %>% left_join(demens, by = "pnr")
saveRDS(resultat, "datasets/extract_dementia.rds")Dette er DARTER-varianten (med load_database() og de bekræftede registernavne for 708421, pr. juni 2026). Den generelle open_dataset()-version og forklaringen bag mønstret står i Fase 9b — Udtræk fra LPR.
Se også
get_lpr_diagnoses() ovenfor pakker mønstret fra den generelle vejledning ind:
- Fase 9 — Hospitalskontakter (LPR) — forklaringen bag to-fase strategien, LPR2/LPR3 og D-præfikset
- Fase 8 — Kend dine registre — hvilket register indeholder hvad
- Registersti og datastores — de bekræftede stier på 708421