Forstå LPR

Struktur, historie og nuancer — før du skriver kode

Published

June 6, 2026

Det Nationale Patientregister (LPR) er kilden til diagnoser og hospitalskontakter. Det dækker alle offentlige hospitalsindlæggelser og ambulante kontakter i Danmark.

LPR er mere komplekst end de fleste registre, fordi det skiftede format i 2019 og er splittet i somatiske og psykiatriske tabeller. Denne side forklarer strukturen — perioderne, ICD-koderne, diagnosetyperne og de faldgruber du skal kende, før du trækker data. De konkrete udtræksopskrifter ligger i Fase 9b — Udtræk fra LPR.

Tip

Kort fortalt: LPR skiftede format i 2019 — brug LPR2 (frem til marts 2019) og LPR3 (derefter) og kombinér dem. Alle ICD-koder har et D-præfiks, du typisk stripper, og du vælger diagnosetyper (A/B til udfald, +G til baseline-komorbiditet).

Tip

Læserækkefølge: Læs denne side først for at forstå data. Gå derefter til Fase 9b for de kørende kodeeksempler. Du bygger selve kohorten i Fase 10.


LPR er opdelt i to perioder

I marts 2019 skiftede LPR format. Studier der dækker perioden på tværs af 2019 skal forespørge begge systemer og kombinere dem.

LPR2 somatisk LPR2 psykiatrisk LPR3
Periode frem til marts 2019 frem til marts 2019 marts 2019 og frem
Kontaktregister lpr_adm t_psyk_adm lpr_a_kontakt
Diagnoseregister lpr_diag t_psyk_diag lpr_a_diagnose
Dækker psykiatri Nej Ja Ja (begge samlet)
Join-nøgle recnum k_recnum / v_recnum¹ dw_ek_kontakt
Datokolonne d_inddto (Date) d_inddto (Date) kont_starttidspunkt (datetime)²
pnr-kolonne pnr v_cpr³ pnr
Diagnosekode c_diag c_diag diag_kode
Diagnosetype c_diagtype c_diagtype diag_kode_type
Kontakttype c_pattype ("0" = indlagt) c_pattype kont_type ("ALCA00" = indlagt)

¹ t_psyk_adm har k_recnum; t_psyk_diag har v_recnum — omdøb begge til recnum inden join. ² datetime-format — konverter med as.Date(). ³ Omdøb: rename(pnr = v_cpr).

Note

Psykiatri: separat i LPR2, samlet i LPR3 Inden 2019 var psykiatriske diagnoser (F-koder: demens, depression mv.) gemt i separate registre (t_psyk_adm, t_psyk_diag). Strukturen ligner somatisk LPR2, men kolonnenavnene afviger — se tabelnoterne ovenfor. Fra marts 2019 samler LPR3 begge: somatiske og psykiatriske kontakter og diagnoser indgår i de samme tabeller, og du behøver ikke en særskilt psykiatrisk forespørgsel.

gantt
    title LPR-registre
    dateFormat  YYYY
    axisFormat  %Y
    section LPR2 somatisk
    lpr_adm + lpr_diag               :done,   1977, 2019
    section LPR2 psykiatrisk
    t_psyk_adm + t_psyk_diag         :done,   1995, 2019
    section LPR3 samlet
    lpr_a_kontakt + lpr_a_diagnose   :active, 2019, 2027


ICD-koder og D-præfikset

ICD-10 (International Classification of Diseases, 10. revision) er WHO’s internationale system til klassifikation af sygdomme og tilstande. Alle hospitaldiagnoser i Danmark kodes med ICD-10, fx G30 for Alzheimers sygdom og F00 for demens ved Alzheimers.

Alle ICD-10-koder i DST har et foranstillet "D": "DG30" (Alzheimers), "DF00" (demens), "DI21" (akut myokardieinfarkt).

Strip typisk D-præfikset inden sammenligning — det giver mere læsbar kode og genbrug til mange udfald:

mutate(icd3 = substr(c_diag, 2, 4))   # "DG30" → "G30" (3-tegns kode)
mutate(icd4 = substr(c_diag, 2, 5))   # "DI219" → "I219" (4-tegns kode)

substr(x, start, stop) beholder tegnene fra position start til og med stop (talt fra 1). substr(c_diag, 2, 4) springer position 1 (D-præfikset) over og beholder tegn 2, 3 og 4: "DG30""G30". Brug 2–5 til 4-tegns koder: "DI219""I219".


Diagnosetyper: A, B og G

Kode Betydning Hvornår inkluderes den
A Aktionsdiagnose — primær årsag til kontakten Altid til udfald
B Bidiagnose — yderligere tilstand til stede Altid til udfald
G Grundmorbus — underliggende baggrundstilstand Kun til baseline-komorbiditet
# Til udfald og eksklusionsdiagnoser:
filter(c_diagtype %in% c("A", "B"))

# Til baseline-komorbiditet (NMI, Charlson):
filter(c_diagtype %in% c("A", "B", "G"))

Tilbagekaldte diagnoser i LPR3 (senere_afkraeftet)

LPR3 markerer diagnoser der er tilbagekaldt. Standardfiltret:

filter(is.na(senere_afkraeftet) | senere_afkraeftet != "Ja")

is.na()-delen er bevidst. R’s standardadfærd er: NA != "Ja" returnerer NA — ikke TRUE. Et filter betragter NA som FALSE og dropper rækken. filter(senere_afkraeftet != "Ja") alene ville derfor fjerne alle diagnoser der slet ikke har en tilbagekaldelsesmarkering (dvs. NA-felter) — selvom de bestemt ikke er tilbagekaldt. is.na(...) retter det: “behold rækken hvis feltet er NA ELLER hvis det ikke er "Ja"”. Filtret beholder dermed ukategoriserede diagnoser, hvilket er den sikreste antagelse.


Næste skridt

Nu kender du LPR’s struktur og de vigtigste faldgruber. Næste skridt er at trække diagnoserne ud med kode:

Fase 9b — Udtræk fra LPR

Se også

Eksternt om LPR3 og 2019-overgangen

Back to top