5  Innlesning av data

Vi skal bruke følgende pakker i dette kapittelet

library(tidyverse)
library(haven)
library(labelled)
library(readxl)

5.1 Generelt om ulike dataformat

Data kan være lagret i mange ulike formater, men det er også problemstillinger knyttet til hvordan dataene er lagret i et gitt format. Dette handler delvis om hvordan noen har valgt å lagre og distribuere data, ikke bare om dataformatet i seg selv.

Det kan være vanskelig å skille mellom hvorvidt utfordringene du møter skyldes dataformatet, softwaren man bruker eller valg andre har tatt. Det kan være flere av disse, men som hovedregel er problemet at data ofte ikke er distribuert i et universelt format. Permanent lagring og distribusjon av data er krevende, men ikke temaet her.

Uansett: du vil ofte få data i et format som ikke er tilrettelagt verken i eller for R. Å gjøre om data fra et format til et annet kan være en avgjørende oppgave for å få gjort noe som helst.

Dette kan være krøkete og du har virkelig muligheten til å kløne det til skikkelig. For at du skal slippe det gir dette kapittelet en oppskrift for å håndtere slike data slik at du kan jobbe videre med dem i R på en hensiktsmessig måte.

R kan imidlertid håndtere det aller meste av dataformater på en eller annen måte, men vi ser bare på de aller mest vanlige her.

5.1.1 rds

Rds-formatet er et format særlig egnet for R. Her er et eksempel med et lite utdrag fra NorLAG

norlag_rds <- readRDS("data/norlag_eksempel.rds")
glimpse(norlag_rds)
Rows: 20,892
Columns: 12
$ ref_nr  <dbl> 5, 5, 10, 10, 10, 12, 12, 15, 15, 18, 18, 22, 23, 23, 25, 27, …
$ round   <dbl> 1, 2, 3, 2, 1, 3, 1, 1, 2, 3, 2, 1, 3, 1, 1, 3, 2, 1, 2, 1, 3,…
$ ioalder <fct> 68, 72, 59, 49, 44, 61, 47, 58, 63, 67, 57, 63, 69, 55, 71, 90…
$ iolandb <fct> NA, Norskfødt, NA, Norskfødt, NA, NA, NA, NA, Norskfødt, NA, N…
$ iokjonn <fct> Mann, Mann, Kvinne, Kvinne, Kvinne, Kvinne, Kvinne, Kvinne, Kv…
$ pa001c  <fct> Ja, Ja, Ja, Ja, Nei, Ja, Ja, Nei, Nei, Ja, Ja, Ja, Ja, Nei, Ne…
$ pa300   <fct> Partner gjør mest, NA, NA, NA, NA, NA, IO gjør mest, NA, NA, N…
$ hc230   <fct> En gang i uken, En gang i uken, 2-3 ganger i måneden, En gang …
$ hc231   <fct> 2-3 ganger i måneden, 2-3 ganger i måneden, NA, 2-3 ganger i m…
$ va207   <fct> Ganske viktig, Litt viktig, Litt viktig, Ikke viktig, Litt vik…
$ hcMCS12 <fct> 59.7766, 60.68044, 58.74768, 60.69717, 55.86777, 53.77948, 60.…
$ hcPCS12 <fct> 54.83583, 51.03453, 55.92348, 55.25834, 55.91285, 57.93332, 56…

5.1.2 Laste workspace med load()

Filer av typen .Rdat eller .Rdata er egentlig ikke et dataformat, men brukes tidvis for å lagre datafiler. Man kan lagre en eller flere datafiler i samme .Rdat fil på disk.

Du kan også lagre et “speilbilde” av hele ditt workspace på denne måten slik at du kan lukke R og så åpne R senere akkurat på det stedet du var i arbeidet. Det kan være kjekt, men forutsetter at du husker hva du drev med forrige gang. Den klare anbefalingen er derfor å ikke bruke dette rutinemessig.

Her bruker man load som laster dette speilbildet og objektet med dataene i beholder det navnet de hadde da de ble laget. Se i fanen “Environment” i Rstudio om det har dukket opp noe nytt der, for å finne navnet hvis du ikke vet det fra før. I dette eksempelet er dataene lagret i et objekt som “norlag_eksempel_rdata” som altså er lagret i en fil som hetere “norlag_eksempel.Rdata”. Ved lasting av filen dukker objektet opp under “Enviroment”-fanen, men du får ikke noen melding av noe slag. Men er altså tilgjengelig i minnet i R. Her er koden:

load("data/norlag_eksempel.Rdata")
glimpse(norlag_eksempel_rdata)
Rows: 20,892
Columns: 12
$ ref_nr  <dbl> 5, 5, 10, 10, 10, 12, 12, 15, 15, 18, 18, 22, 23, 23, 25, 27, …
$ round   <dbl> 1, 2, 3, 2, 1, 3, 1, 1, 2, 3, 2, 1, 3, 1, 1, 3, 2, 1, 2, 1, 3,…
$ ioalder <fct> 68, 72, 59, 49, 44, 61, 47, 58, 63, 67, 57, 63, 69, 55, 71, 90…
$ iolandb <fct> NA, Norskfødt, NA, Norskfødt, NA, NA, NA, NA, Norskfødt, NA, N…
$ iokjonn <fct> Mann, Mann, Kvinne, Kvinne, Kvinne, Kvinne, Kvinne, Kvinne, Kv…
$ pa001c  <fct> Ja, Ja, Ja, Ja, Nei, Ja, Ja, Nei, Nei, Ja, Ja, Ja, Ja, Nei, Ne…
$ pa300   <fct> Partner gjør mest, NA, NA, NA, NA, NA, IO gjør mest, NA, NA, N…
$ hc230   <fct> En gang i uken, En gang i uken, 2-3 ganger i måneden, En gang …
$ hc231   <fct> 2-3 ganger i måneden, 2-3 ganger i måneden, NA, 2-3 ganger i m…
$ va207   <fct> Ganske viktig, Litt viktig, Litt viktig, Ikke viktig, Litt vik…
$ hcMCS12 <fct> 59.7766, 60.68044, 58.74768, 60.69717, 55.86777, 53.77948, 60.…
$ hcPCS12 <fct> 54.83583, 51.03453, 55.92348, 55.25834, 55.91285, 57.93332, 56…

5.1.3 csv-filer

Såkalte csv-format er ren tekstformat der verdiene i kollonnene har skilletegn. Skilletegnet er nesten alltid komma eller semikolon, men kan i prinsippet være hva som helst. Hvis du får feilmeldinger og det ser skikkelig rart ut, så åpen filen i Notepad (eller annet ren-tekst program) og sjekk. I koden nedenfor er det spesifisert komma som skilletegn, men hvis det er semikolon endrer du det til sep =",". I utgangspunket forventer read.csv at det er kommaseparert, så koden vil funkere her uten den delen.

norlag_eksempel_csv <- read.csv("data/norlag_eksempel.csv", sep =",")
glimpse(norlag_eksempel_csv)
Rows: 20,892
Columns: 12
$ ref_nr  <int> 5, 5, 10, 10, 10, 12, 12, 15, 15, 18, 18, 22, 23, 23, 25, 27, …
$ round   <int> 1, 2, 3, 2, 1, 3, 1, 1, 2, 3, 2, 1, 3, 1, 1, 3, 2, 1, 2, 1, 3,…
$ ioalder <int> 68, 72, 59, 49, 44, 61, 47, 58, 63, 67, 57, 63, 69, 55, 71, 90…
$ iolandb <chr> NA, "Norskfødt", NA, "Norskfødt", NA, NA, NA, NA, "Norskfødt",…
$ iokjonn <chr> "Mann", "Mann", "Kvinne", "Kvinne", "Kvinne", "Kvinne", "Kvinn…
$ pa001c  <chr> "Ja", "Ja", "Ja", "Ja", "Nei", "Ja", "Ja", "Nei", "Nei", "Ja",…
$ pa300   <chr> "Partner gjør mest", NA, NA, NA, NA, NA, "IO gjør mest", NA, N…
$ hc230   <chr> "En gang i uken", "En gang i uken", "2-3 ganger i måneden", "E…
$ hc231   <chr> "2-3 ganger i måneden", "2-3 ganger i måneden", NA, "2-3 gange…
$ va207   <chr> "Ganske viktig", "Litt viktig", "Litt viktig", "Ikke viktig", …
$ hcMCS12 <dbl> 59.77660, 60.68044, 58.74768, 60.69717, 55.86777, 53.77948, 60…
$ hcPCS12 <dbl> 54.83583, 51.03453, 55.92348, 55.25834, 55.91285, 57.93332, 56…

5.1.4 Excel

Forbløffende mye data foreligger i Excel-format. Det finnes egne funksjoner for å jobbe direkte med excel-filer. Blant annet pakken readxl gir funksjoner til å lese inn denne typen filer. Det finnes også andre pakker for å håndtere Excel-filer, men hvis formålet bare er å lese inn data, så gjør denne pakken jobben. Husk å laste pakken først. Her er et eksempel:

library(readxl)
norlag_xlsx <- read_excel("data/norlag_panel.xlsx")
glimpse(norlag_xlsx)
Rows: 20,892
Columns: 12
$ ref_nr  <dbl> 5, 5, 10, 10, 10, 12, 12, 15, 15, 18, 18, 22, 23, 23, 25, 27, …
$ round   <dbl> 1, 2, 3, 2, 1, 3, 1, 1, 2, 3, 2, 1, 3, 1, 1, 3, 2, 1, 2, 1, 3,…
$ ioalder <chr> "68", "72", "59", "49", "44", "61", "47", "58", "63", "67", "5…
$ iolandb <chr> NA, "Norskfødt", NA, "Norskfødt", NA, NA, NA, NA, "Norskfødt",…
$ iokjonn <chr> "Mann", "Mann", "Kvinne", "Kvinne", "Kvinne", "Kvinne", "Kvinn…
$ pa001c  <chr> "Ja", "Ja", "Ja", "Ja", "Nei", "Ja", "Ja", "Nei", "Nei", "Ja",…
$ pa300   <chr> "Partner gjør mest", NA, NA, NA, NA, NA, "IO gjør mest", NA, N…
$ hc230   <chr> "En gang i uken", "En gang i uken", "2-3 ganger i måneden", "E…
$ hc231   <chr> "2-3 ganger i måneden", "2-3 ganger i måneden", NA, "2-3 gange…
$ va207   <chr> "Ganske viktig", "Litt viktig", "Litt viktig", "Ikke viktig", …
$ hcMCS12 <chr> "59.7766", "60.68044", "58.74768", "60.69717", "55.86777", "53…
$ hcPCS12 <chr> "54.83583", "51.03453", "55.92348", "55.25834", "55.91285", "5…

Men Excel-filer kan ha en litt mer komplisert struktur enn dette eksempelet. Data kan ligge i ulike faner i Excel-filen, men det kan da håndteres med å legge til argumentet sheet = .... Hvis excel-arket inneholder mye tekst eller andre ting som gjør at de faktiske dataene kommer litt lengre ned, så kan det spesifiseres hvilket celleområde som det skal leses inn fra ved range = ... eller bare hoppe over noen rader med skip = ....

På dette kurset skal vi ikke bruke Excel-filer, men det er stor sannsynlighet for at du vil få bruk for dette senere en gang.

5.1.5 Proprietære format: Stata, SPSS og SAS

5.1.5.1 Stata

norlag_dta <- read_stata("data/norlag_panel.dta")
glimpse(norlag_dta)
Rows: 20,892
Columns: 12
$ ref_nr  <dbl> 5, 5, 10, 10, 10, 12, 12, 15, 15, 18, 18, 22, 23, 23, 25, 27, …
$ round   <dbl> 1, 2, 3, 2, 1, 3, 1, 1, 2, 3, 2, 1, 3, 1, 1, 3, 2, 1, 2, 1, 3,…
$ ioalder <dbl+lbl> 29, 33, 20, 10,  5, 22,  8, 19, 24, 28, 18, 24, 30, 16, 32…
$ iolandb <dbl+lbl> NA,  1, NA,  1, NA, NA, NA, NA,  1, NA,  1, NA, NA, NA, NA…
$ iokjonn <dbl+lbl> 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 2…
$ pa001c  <dbl+lbl> 2, 2, 2, 2, 1, 2, 2, 1, 1, 2, 2, 2, 2, 1, 1, 2, 2, 2, 1, 1…
$ pa300   <dbl+lbl>  1, NA, NA, NA, NA, NA,  2, NA, NA, NA, NA,  3, NA, NA, NA…
$ hc230   <dbl+lbl> 3, 3, 4, 3, 3, 9, 9, 1, 1, 9, 9, 1, 9, 3, 4, 3, 3, 4, 4, 3…
$ hc231   <dbl+lbl>  4,  4, NA,  4,  3, NA,  9,  2,  1, NA,  9,  2, NA,  4,  5…
$ va207   <dbl+lbl> 2, 3, 3, 4, 3, 5, 5, 3, 4, 5, 5, 1, 5, 3, 3, 2, 3, 3, 4, 4…
$ hcMCS12 <dbl+lbl> 6350, 6647, 5994, 6650, 4891, 4121, 6672, 4736, 3529, 4632…
$ hcPCS12 <dbl+lbl> 7085, 6420, 7258, 7149, 7255, 7544, 7355, 6956, 7368, 7342…

Legg merke til at den andre kolonnen her viser hva slags variabeltype det er. <dbl> betyr at det er numerisk variabel^(Det finnes flere typer numeriske variable som vi for praktiske analyser sjelden behøver å forholde oss til. <dbl> står for Double som er et lagringsformat som kan ta svært mange desimaler. Det kan også stå <num> som håndterer færre desimaler. Det er også vanlig med <int> som står for Integer, altså heltall uten desimaler.) På noen variable står det også <dbl+lbl> der lbl står for labelled som betyr at det finnes såkalte labler tilhørende variabelen. Labler er vanlig å bruke i programmene Stata og SPSS, men er ikke noe som vanligvis brukes i R. Men R leser det inn og kan håndtere dette helt fint. Men som hovedregel er det bedre å rydde opp slik at dataene blir slik vi vanligvis bruker det i R. Dette er grunnen til at dere får en bearbeidet versjon av NorLAG datasettet!

Neste kapittel er spesielt om NorLAG i formatet .rds. Hvordan effektivt lese inn fra Stata til R og gjøre om labler er dekket i et appendiks. De av dere som senere skal jobbe med data levert ut fra Sikt kan ha behov for dette, og da kan dere ta en nærmere titt på appedikset. For dette forkurset og SOS4020 vil dere ikke trenge kunne akkurat det.

5.1.5.2 SPSS og SAS

Andre vanlige dataformater er formater fra statistikkpakkene SPSS og SAS, med filhalene henholdsvis .sav og .sas7bdat. De leses inn på tilsvarende funksjoner tilpasset disse dataformatene. Her er eksempel for innlesning av SPSS-fil:

norlag_sav <- read_spss("data/norlag_panel.sav")
glimpse(norlag_sav)

Her er eksempel for innlesning av SAS-fil:

norlag_sas <- read_sas("data/norlag_panel.sas7bdat")
glimpse(norlag_sas)
Rows: 20,892
Columns: 12
$ ref_nr  <dbl> 5, 5, 10, 10, 10, 12, 12, 15, 15, 18, 18, 22, 23, 23, 25, 27, …
$ round   <dbl> 1, 2, 3, 2, 1, 3, 1, 1, 2, 3, 2, 1, 3, 1, 1, 3, 2, 1, 2, 1, 3,…
$ ioalder <dbl> 29, 33, 20, 10, 5, 22, 8, 19, 24, 28, 18, 24, 30, 16, 32, 51, …
$ iolandb <dbl> NA, 1, NA, 1, NA, NA, NA, NA, 1, NA, 1, NA, NA, NA, NA, NA, 1,…
$ iokjonn <dbl> 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 2, 1,…
$ pa001c  <dbl> 2, 2, 2, 2, 1, 2, 2, 1, 1, 2, 2, 2, 2, 1, 1, 2, 2, 2, 1, 1, 2,…
$ pa300   <dbl> 1, NA, NA, NA, NA, NA, 2, NA, NA, NA, NA, 3, NA, NA, NA, NA, N…
$ hc230   <dbl> 3, 3, 4, 3, 3, 9, 9, 1, 1, 9, 9, 1, 9, 3, 4, 3, 3, 4, 4, 3, 4,…
$ hc231   <dbl> 4, 4, NA, 4, 3, NA, 9, 2, 1, NA, 9, 2, NA, 4, 5, NA, 3, 6, 4, …
$ va207   <dbl> 2, 3, 3, 4, 3, 5, 5, 3, 4, 5, 5, 1, 5, 3, 3, 2, 3, 3, 4, 4, 4,…
$ hcMCS12 <dbl> 6350, 6647, 5994, 6650, 4891, 4121, 6672, 4736, 3529, 4632, 56…
$ hcPCS12 <dbl> 7085, 6420, 7258, 7149, 7255, 7544, 7355, 6956, 7368, 7342, 69…

5.1.6 Dataformater for store data

Det finnes en hel rekke andre formater for spesielle formål, derav formater for store data. Med store data mener vi her enten at de er så store at det upraktisk lang tid å lese det inn - eller så store at det ikke er plass i minnet på datamaskinen. Formatene feather og parquet er varianter av det samme og håndteres med pakken Arrow. Det finnes også andre pakker for store data, men Arrow er nå den anbefalte. En annen grunn til det er at disse datasettene tillater sømløs bytte mellom programmeringsspråkene R og Python. Men det går laaaagt utenfor formålet med dette forkurset.

For mer spesielle behov går det også an å koble mot databaser som MySQL, Spark, Oracle eller noe helt annet, og en oversikt finnes her.

Eneste du trenger være klar over akkurat nå er at R kan håndtere svært mange forskjellige dataformater og koble mot andre løsninger. Kanskje vil du trenge det en gang - kanskje ikke.