Detta är ett litet test för at se om man ev kan matcha våra sjukhus mot deras geo-koordinater för att sedan markera dessa enheter på karta. Det finns ett öppet API mot delar av HSA-katalogen. Bara ett mindre antal landsting är ännu anslutna (VGR finns) Smen jag tolkar det som att fler landsting kommer föras in framöver. Mer info finns här: http://hip.se/oppen-data/domain/5141bf7ee211b84875000010/service/lista-hsa-objekt-1/

Förberedelser

Den data jag läser ner via JSON från HSA-katalogen är visserligen en data frame men inte i det format som dplyr-paketet kräver. Vissa kolumner är nämligen inte atomic vectors utan i sin tur data frames. Dock läser jag in dplyr ändå för tillgång till pipen.

library(dplyr)
library(leaflet) # För att skapa karta

Ladda ner HSA-data

hsa <- jsonlite::fromJSON("http://api.offentligdata.minavardkontakter.se/orgmaster-hsa/v1/hsaObjects.json")

names(hsa)
##  [1] "hsaId"                      "hsaIdUrlEncoded"           
##  [3] "type"                       "dn"                        
##  [5] "parentDn"                   "parentDnUrlEncoded"        
##  [7] "relativeDistinguishedName"  "description"               
##  [9] "management"                 "postalAddress"             
## [11] "countyCode"                 "countyName"                
## [13] "street"                     "webAddress"                
## [15] "geoLocation"                "careType"                  
## [17] "businessClassificationCode" "businessClassificationName"
## [19] "telephoneNumber"            "orgNo"                     
## [21] "surgeryHours"               "telephoneHours"

Endast gynekologi

För att få en mer hanterlig datamängd kan vi begränsa oss til gynekologiska enheter. Jag testar att identifiera dessa enheter via deras namn enligt http://www.inera.se/Documents/TJANSTER_PROJEKT/Katalogtjanst_HSA/Innehall/HSA_innehall_verksamhetskod.pdf

gyn_enheter <- c(
    "Gynekologi",
    "Onkologi, gynekologisk",
    "Akutverksamhet vid sjukhus, gynekologi "
)

# Begränsa till gyn_enheter
index_gyn_enheter <- 
    unlist(lapply(hsa$businessClassificationName, 
       function(x) any(x %in% gyn_enheter)))
hsa <- subset(hsa, index_gyn_enheter)

Matcha våra sjukhusnamn mot rätt HSA-id

Eftersom vi inte har ngt HSA-id direkt knutet till våra enheter så tror jag detta kan bli svårt tyvärr. Ev får man försöka gå via namn i klartext Det är inte jättetydligt vad enheterna i HSA-katalogen heter men man kan få fram namninformation från variabel “dn”. Varje element är en teckensträng med flera delar enligt http://hip.se/oppen-data/domain/5141bf7ee211b84875000010/meta/ Jag begränsar mig till de delar av strängen som inleds med “ou=” dvs organisationsenheter

# Plocka fram textsträng som kan  matchas mot våra sjukhusnamn i klartext
dn <- strsplit(hsa$dn, ",") %>% 
        lapply(function(x) x[substr(x, 1, 2) == "ou"] %>% substring(4))
head(dn)
## [[1]]
## [1] "Kvinnokliniken Hallands sjukhus" "Område 4"                       
## [3] "Hallands sjukhus"               
## 
## [[2]]
## [1] "Gynmottagning Köping" "Kvinnokliniken"       "Västmanlands sjukhus"
## 
## [[3]]
## [1] "Gynekologisk enhet"      "Kvinnoklinik"           
## [3] "Södra Älvsborgs Sjukhus"
## 
## [[4]]
## [1] "Gynekologisk enhet"      "Kvinnoklinik"           
## [3] "Södra Älvsborgs Sjukhus"
## 
## [[5]]
## [1] "Kvinnoklinikens mottagning" "Kvinnokliniken"            
## [3] "Västmanlands sjukhus"      
## 
## [[6]]
## [1] "Gynekologimottagning"     "Opererande specialiteter"
## [3] "Angereds Närsjukhus"

Lyckas inte men …

Tyvärr lyckas jag inte komma vidare härifrån. Jag försökte t ex matcha namnen i dn mot våra namn från decode-översättning med hjälp av “fuzzy matching” via min funktion “best_match” i rcc-paketet men tydligen är namnen för olika för att kunna matchas :-( Men om man skulle lyckas med en matchning (eller få en HSA-nyckel-id-nyckel direkt) så finns sedan koordinaterna lättillgängliga:

head(hsa$geoLocation)
##     longitude latitude
## 2    12.84779 56.68198
## 43   16.00268 59.50911
## 48   12.96176 57.72507
## 49   12.96176 57.72507
## 123  16.58052 59.61759
## 159  12.05070 57.79617

För exemplets skull kan vi just nu bara plocka alla gyn-enheter från VGR (utan att koppla detta till våra kvalregdata).

koordinater <- subset(hsa, countyName == "Västra Götalands län",
                      c("relativeDistinguishedName", "geoLocation")
                )

Vi testar att göra en liten karta

Mna kan förstås använda olika metoder för att skapa karta men här testar jag med leaflet-paketet och det enda jag gör är att jag skriver ut namnen på de valda enheterna.

Klickar man på enheten så visas texten från kolumnen relativeDistinguishedName.

    leaflet() %>% 
    addTiles() %>% 
    addMarkers(lng = koordinater$geoLocation$longitude,
              lat = koordinater$geoLocation$latitude,
              popup = koordinater$relativeDistinguishedName
    )