KHELSE function
Innhold
Gjennomgang av funksjoner brukes i KHELSE funksjon. Funksjonene som presenteres her er tilnærmet
rekkefølgen de blir kalles inn. Funksjoner som har blitt sjekket har tags ##FUN01
etc.
1. SettDefDesignKH
En del av globs
. Henter parametre fra tabell KH_DELER. Lager variabler med TYPE = INT
med
extention *.l
og *.h
for evt. lavest og høyest verdi. Lager en list objekt som følgende:
list(DelKols=DelKols, #uten deling FYLKE og GEO i GEOniv DelKolsF=DelKolsF, #med deling for FYLKE og GEO KolsDel=KolsDel, # motsatte av DelKols DelKolN=DelKolN, #kolonne DelKol med attribute fra DEL DelType=DelType, #kolonne TYPE med attribute fra DEL DelFormat=DelFormat, #kolonne FORMAT med attribute fra DEL UBeting=UBeting, BetingOmk=BetingOmk, BetingF=BetingF, OmkDel=OmkDel, DesignKols=DesignKols, #Kolonne uten TABS DesignKolsF=DesignKolsF, #Kolonne med TABS DesignKolsFA=DesignKolsFA, #Alle kolonne inkludert FYLKE og GEO AggPri=AggPri, #ordered DEL ift. AGGREGERPRI AggVedStand=AggVedStand, #velger only A og K IntervallHull=IntervallHull, AMissAllow=TRUE)
2. LagFilgruppe
Hovedfunksjon for å lese raw data og slå sammen dataene til en RDS fil.
2.1. Argumenter
- gruppe :
- batchdate : fra SettKHBatchDate()
- globs : from FinnGlobs()
- diagnose = 0
- printR = TRUE
- printCSV = FALSE
- printSTATA = FALSE
- versjonert = FALSE
- dumps = list()
2.2. Prosess
Beskrivelse av prosessene:
- FinnfilgruppeParametre() lager FGP object
- FinnFilBeskGruppe() lager filbesk object
- Loop alle rader i
filbesk
og lager følgende:- filn som er absolutt path til filen
- AAR hvis det ikke er spesifisert eller skrevet som
<$y>
skal value hentes fra DEFAAR i ORIGINALFILER tabell
2.3. Output
3. FinnFilgruppeParametre
Setter inn parameter til en filgruppenavn. Access tabell FILGRUPPER
brukes i denne funksjonen.
Denne produserer object FGP til viderebruk.
3.1. Argumenter
- gruppe : Filgruppenavn
- batch : fra SettKHBatchDate(). Denne lager dagens dato til format «%Y-%m-%d-%H-%M»
- globs : fra FinnGlobs() function.
3.2. Output
En tabell av type list hentet fra tabell FILGRUPPER. I tillegg legges det 3 til dvs. vals
,
amin
og amax
. De to siste er for alder minimum og maksium hentet fra kolonne ALDER_ALLE
. List
vals
i tillegg inneholder 3 tillegg lister $vals$verdi_i_VAL1navn
, $vals$verdi_i_VAL1navn$miss
og
$vals$verdi_i_VAL1navn$miss
. Det samme for VAL2 og VAL3. F.eks for filgruppe ARBEIDSLEDIGE så blir det:
$vals $vals$ARBEIDSLEDIGE $vals$ARBEIDSLEDIGE$miss [1] "0" $vals$ARBEIDSLEDIGE$sumbar [1] "1"
3.3. Kommentar
- Sjekk aktiv filgruppenavn basert på tidsperiode dvs.
VERSJONFRA
ogVERSJONTIL
i Access tabell, men denne informasjon er ikke brukes eller oppdateres. ObjectFGPaktiv
. - Sjekk hvis det er duplikater filgruppenavn. Denne er unødvendig hvis kolonne
FILGRUPPE
er nøkkel eller unik i Access tabell. - Object
amax
for maksimal aldre hentes fra Access tabel HOVEDPARAMETREg, men der er det bare en linje som lager default for maks alder. Kan dette gjøres annen sted eller er dette egentlig en ubrukt tabell?
4. FinnFilBeskGruppe
Henter filnavn og path gjennom informasjon i Access tabell ORIGINALFILER, INNLESING og ORGINNLESkobl. Denne funksjonen produserer object delfiler til viderebruk.
4.1. Argumenter
- gruppe : filgruppenavn
- batchdate = NULL
- globs : fra
FinnGlobs()
SQL spesifikasjonen som brukes:
sqlt<-paste("SELECT KOBLID, ORIGINALFILER.FILID AS FILID, FILNAVN, FORMAT, DEFAAR, INNLESING.* FROM INNLESING INNER JOIN ( ORGINNLESkobl INNER JOIN ORIGINALFILER ON ORGINNLESkobl.FILID = ORIGINALFILER.FILID) ON (INNLESING.DELID = ORGINNLESkobl.DELID) AND (INNLESING.FILGRUPPE = ORGINNLESkobl.FILGRUPPE) WHERE INNLESING.FILGRUPPE='",filgruppe,"' AND ORIGINALFILER.IBRUKFRA<=",datef," AND ORIGINALFILER.IBRUKTIL>", datef," AND INNLESING.VERSJONFRA<=",datef," AND INNLESING.VERSJONTIL>",datef,sep="")
Disse variabler er laget av denne funksjonen:
> names(fb) [1] "KOBLID" "FILID" "FILNAVN" "FORMAT" "DEFAAR" [6] "ID" "FILGRUPPE" "DELID" "BRUK" "VERSJONFRA" [11] "VERSJONTIL" "FORMATgml" "INNLESARG" "MANHEADER" "MULTIHEAD" [16] "KASTKOLS" "UNDERTABLOK" "FYLLTAB" "RESHAPEid" "RESHAPEmeas" [21] "RESHAPEvar" "RESHAPEval" "AGGERGER_DF" "RSYNT1" "RSYNT2" [26] "FEILRAPPORT" "GEO" "GEOd2" "GRUNNKRETS" "TKNR" [31] "SONER" "AAR" "KJONN" "ALDER" "UTDANN" [36] "SIVST" "LANDBAK" "TAB1" "TAB2" "TAB3" [41] "VAL1" "VAL2" "VAL3" "ALDERkb" "KJONNkb" [46] "TAB1kb" "TAB2kb" "TAB3kb" "KOMMENTAR" "RAPPORT2" [51] "TID" "PROSESSDATO" "SKALA_VAL1" "SKALA_VAL2" "SKALA_VAL3"
4.2. Output
5. LagTabellFraFil
5.1. Argumenter
- filbesk : Object fra
FinnFilBeskGruppe()
function - FGP : Object fra
FinnFilgruppeParametre()
function - diagnose = diagnose
- globs = globs
- versjonert = versjonert
- dumps = dumps
5.2. Output
5.3. TODO Kommentar [0/0]
[ ]
Hva skal kolonne FYLLTAB brukkes til?[ ]
Hvor finner man kolonner RESHAPEpre og RESHAPEpost?[ ]
Hva er GEOd2?
6. LesFil
Innkalt under LagTabellFraFil() function
6.1. Argumenter
- filbesk
- batchdate = batcdate
- globs = globs
- dumps = dumps
6.2. Output
7. FinnFilGruppeFraKoblid
Valg filgruppenavn i kolonne FILGRUPPE som match filbesk$KOBLID
fra tabell ORGINNLESkobl. Innkalles under
LesFil() i sqlQuery for INSERT i SQL kode med argument filbesk$KOBLID
.
7.1. Argumenter
- koblid : verdi fra object filbesk$KOBLID
- globs : fra function FinnGlobs()
7.2. Output
En vector av den filgruppenavn til den spesifisert KOBLID eg. UFORE
.
8. TilFilLogg
OBS!: Denne funksjonen ender opp med CRASH nokså ofte! Innkalles under LesFil() for å leser
Access tabell INNLES_LOGG basert på KOBLID og objekt batchdate
.
8.1. Argumenter
- koblid :
- felt :
- verdi :
- batchdate : from SettKHBatchDate() function
- globs : fra FinnGlobs()
Query som brukes bl.a
sqlQuery(globs$log,paste("DELETE * FROM INNLES_LOGG WHERE KOBLID=",koblid,"AND SV='S'",sep="")) upd<-paste("INSERT INTO INNLES_LOGG ( KOBLID, BATCH, SV, FILGRUPPE ) SELECT=",koblid,",'",batchdate,"', 'S',",FinnFilGruppeFraKoblid(koblid),sep="") sqlQuery(globs$log,upd) upd<-paste("UPDATE INNLES_LOGG SET ",felt,"=",verdi," WHERE KOBLID=",koblid," AND SV='S' AND BATCH='",batchdate,"'",sep="")
8.2. Output:
Legger til ny rad i INNLES_LOGG tabell via INSERT eller oppdatere tabellen via UPDATE.
9. KHCsvread
Leser inn CSV filer ved bruk read.csv
eller data.table::fread
.
9.1. Argumenter
- filn : Absolutt sti til filen
- header = FALSE
- skip = 0
- calClasses = «character»
- sep = «;»
- quote = «\»« obs! denne bør være ‘\»’
- dec = «.»
- fill = FALSE
- encoding = «unknown»
- blank.lines.skip = FALSE
- na.strings = c(«NA»)
- brukfread = TRUE
- …
9.2. Output
En csv fil med header=FALSE dvs. header i tabellen blir til en ny kolonne. Hvorfor??
9.3. Kommentar
Koden for å lese csv med fread
som produserer data.frame
kan skrives slik:
fread(DT, data.table = FALSE)
10. cSVmod
Restrukturerer dataene ved bruk parametrer fra INNLESING tabell.
10.1. Argumenter
- DF : data.frame i CSV format fra KHCsvread eller XLS
- filbesk :
- header = TRUE
- skip = 0 Hvilke rader som skal uttelates ved lesing
- slettRader = integer(0)
obs! her bør det være
0L
. Denne skal velger rader som skal slettes. - sisteRad = 1 Velges hvilken som er siste rader
- TomRadSlutt = FALSE Velge hvilken rader som er tommer og subsett data.frame fra rad 1 til raden som den tomme raden.
- FjernTommeRader = FALSE Slett tomme rader i hele data.frame
- FjernTommeKol = TRUE Slett tomme kolonne
- globs = FinnGlobs()
- …
10.2. Output
10.3. Kommentar
Flere argumenter som egentlig gjør nesten det samme oppgavene. Alternativ å finne tomme rader
eller kolonne kan brukes apply
og er nok raskere.
rnames <- rownames(DF[apply(is.na(DF) | DF == "", 1, all), ]) #for rader knames <- rownames(DF[apply(is.na(DF) | DF == "", 2, all), ]) #for kolonner which(rownames(DF) %in% tnames)
10.4. Forbedring
- Finne ut i INNLESSING tabell hvor mange som har
FjernTommeRader
ogFjernTommeKol
. Sjekk
hvordan filen ser ut og tilpasse deretter før ny database lages.
11. Generell spørsmål
Alle type spørsmål som trenger oppklaring:
11.1. Variable med *.l
og *.h
extention
Alle år og aldre er ALLTID intervaller i hele systemet. Dermed brukes alltid AARl/AARh og ALDERl/ALDERh. Dette gjelder selv om det bare dreire seg om enkelte kalenderår (AARl=2020, AARh=2020) eller enkle aldersår (ALDERl=30,ALDERh=30).
11.2. Hva er val.f
og val.a
, og hvordan den brukes?
val.a
og val.f
er to flagg som alltid går hånd i hånd med hver verdikolonne. Detaljene kan
våre ganske kompliserte, men i hovedtrekk:
val.a
teller opp hvor mange originaltall som har vårt brukt til å lage verdien. Eksempler:
Når to kommuner slås sammen for kommuneharmonisering blir det typisk val.a=2
. Når tall for
5 enkeltaldre slås sammen til en 5 års aldersgruppe blir det val.a=5
. De to tilfellen i
kombinasjon gir val.a=10
val.f
er strengt tatt viktigere. Den angir i hovedtrekk hvorfor tall er NA. Er det fordi tallet
mangler originalt, er det fordi det ikke lar seg bergene, er det fordi det anonymisres osv.
Men begge val.a
og val.f
får statis ferdi henholdsvis 0 og 1. Se koden.
valok<-1 valf<-paste(val,".f",sep="") vala<-paste(val,".a",sep="") valomk<-paste(val,"omk",sep="") ##Lag omkodet verdi med numerisk. Ikke numerisk blir foreløpig NA suppressWarnings(DF[,valomk]<-as.numeric(valKB$omk)) DF[,valf]<-0 DF[,vala]<-1 DF[valKB$omk==".." & DF[,val]!=valKB$omk,valf]<-1 DF[valKB$omk=="." & DF[,val]!=valKB$omk,valf]<-2 DF[valKB$omk==":" & DF[,val]!=valKB$omk,valf]<-3
11.3. Hva kolonne TYP brukes til i GeoKoder tabell? Verdien er O og U.
TYP=0 er de Ordinåre geokodene, TYP=U er geokoder som angir «Uoppgitt» (slik som at 1199 er uopgitt kommune under fylket 11). Dette filteret brukes når det produseres kuber og Firksvik-data, da blir det ikke rapportert tall for U-koder, men disse må våre med fram til da fordi de inngår i summer som lager totaler for høyere geografisk nivå (1199 tall inngår i 11 osv).
11.4. I Access tabell FILGRUPPER for kolonne ALDER_ALLE som har ingen data
Noen ganger skreves det som NA
eller 25_
. Når det er NA
så plukket verdier fra default ie.
min og maks alder. Når det er bare 25_
så legges maks alder fra tabell ..
12. Access related spørsmål
Dette er spørsmål spesifisert til kolonnebruk i Access tabeller.
12.1. FILGRUPPER tabell
- Hva kolonne FILTER1, FILTER2 og FILTER3 brukes til? Verdien er
1
. - Kolonne ALDER_ALLE har forskjellige verdier bl.a
0_120
,1_6
,25_
og ingen verdi? Når ingen verdi blir det satt 0_120 som min og maks alder. Når det skreves bare25_
skal det får 25 som min alder og 120 som maks alder.
13. SPVflagg
Disse gjelder når dataene er kjørt i LagKUBE
. Notat er fra Steinar.
Kode i data | Tegn i KH/NH tabell | Tekst i fotnote | Tekst i SSB Statbank fotnote |
---|---|---|---|
0 | ingen | ||
1 | .. | Manglende data | Tallgrunnlag mangler dvs. tall er ikke kommet inn i våre databaser eller er for usikre til å publiseres |
2 | . | Lar seg ikke beregne | Ikke mulig å oppgi tall dvs. tall finnes ikke på dette tidspunktet fordi kategorien ikke var i bruk da tallene ble samlet inn |
3 | : | Anonymisert | Vises ikke av konfidensialitetshensyn dvs. tall publiseres ikke for å unngå å identifisere personer eller virksomheter |
Kodene settes i gamleløypa (KHfunctions.R, i kubeproduksjonstrinnet) i variabler med navn <måtall>.f . Det er flere koder i bruk inne i databehandlingen, fordi ulike årsaker til at det mangler tall må behandles ulikt ved aggregering, prikking og skjuling. Helt til slutt i LagKUBE oversettes de interne kodene til en av de tre vist ovenfor.
Den koden som kommer ut i kuben, ser ikke alltid logisk ut. I flere tilfeller har vi skrevet postprosesseringsscript som har «ryddet opp» i kodene, når vi vet at det er spesielle årsaker til at større grupper i dataene (for eksempel bydelene i noen byer) har manglende tall.
14. Spesialvariabler i R
..a | Antall rader tallet stammer fra (Kommunesammenslåinger!, M+K -> Kjønn samlet, o.l.) |
..f | Flagg, blir til SPVflagg etter et sett regler. Det er ett slikt flagg for hver tallvariabel, men de samles til en verdi i SPVflagg. Reglene er bl.a. : |
- Verdier 1-2-3 blir til det samme i SPVflagg. Kan altså sette disse direkte, hvis de skal rettes. | |
- Verdier -1 og 4 blir til SPVflagg=3, verdi 9 blir til =1. | |
+ Verdi 4 betyr «Naboprikket», og utløser ikke skjuling av serier. | |
- Verdi 8: Dukket opp i Skjenketidsslutt og Skjenkesteder for kommuner med tom celle i inndata. Har ikke klart å finne ut hva kodene betyr, og Kåre husker ikke/har ikke tid til å grave det fram - det var en komplisert hack for å håndtere ubalanse i Sysvak. | |
+ Håndtert ved å legge følgende i KODEBOK for aktuell innlesingsspec: Tom celle i VAL1 kodes til «..» (uten gåseøyne). | |
- Hvis verdien skal korrigeres til et høyere tall i min RSYNT, holder det å endre i en av de måltallkolonnene som skal leveres ut (da bruker systemet den høyeste verdien for alle ut-kolonner). Men hvis jeg skal korrigere nedover, f.eks. til SPVflagg==1, må jeg behandle alle ut-kolonnene. DET ER TRYGGEST å ta alle, uansett … | |
- Erfaring: Reglene virker bare skikkelig når filen bruker standardvariablene. Se nedenfor.* | |
..n | Antall årganger tallet stammer fra (f.eks. ved glidende snitt) |
MALTALL | Er en intern resultatkolonne, som kopieres til riktig ut-kolonne. På stadiet «RSYNT_POSTPROSESS» er den ferdig brukt og overflødig, den dør like etter. |
STANDARD | Dersom standardkolonnene fins, er det de som blir levert ut. Teller, Rate, Meis og SMR. |
ANDRE | Sjekk i FILFILTRE. Der kan det være spesifisert mellomregninger etc. (Eks. : Vaksgrad (i Sysvak) - stå som navn på VAL1 i innlesingen, er faktisk levert vaks.dekning, men brukes i beregning av Teller spesifisert i FILFILTRE.) |
Flagg når det er spesielle variabelnavn: Overfør rettinger til et av standardflaggene!
«Vedvarende lavinntekt NH» brukte ingen av de standard
tallvariablene som har en tilhørende _f-variabel (teller, nevner, rate), og
dermed var heller ingen av standard _f -variablene i bruk (alt var missing i
disse). Det fantes et måltall LAVINNT_VEDV
, med tilhørende LAVINNT_VEDV_f
, men
da fungerte ikke produksjon av SPVflagg i henhold til denne flaggvariabelen.
SPVflagg ble feil, og retting i LAVINNT..._f
i en Rsynt-Postprosess virket ikke.
Jeg satte replace RATE_f = LAVINNT_VEDV_f til slutt i en Rsynt-Postprosess, og da slo endringene inn i SPVflagg.