Importere data

Importere data til R

11.0.1 Filformater

Det finnes mange filformater for rektangulære data (data med kolonner og rader). Slike data kan også kalles flat files fordi de er flate i den forstand at de bare har to dimensjoner (rader og kolonner). Noen applikasjoner (SPSS, SAS, STATA, Excel, Numbers osv.) bruker spesifikke filformater som ikke kan brukes av andre applikasjoner. Dette kan bli et problem ved overføring av data mellom ulike applikasjoner. For å unngå slike problemer kan man bruke et universelt filformat, det vil si et filformat som kan brukes av alle programmer på alle datamaskiner. Det mest universelle filformatet er DSV, som står for Delimiter Separated Values, eller på norsk skilletegnseparerte verdier.

I disse filene er verdiene avgrenset med et skilletegn (separator). Tabellen nedenfor viser ulike DSV-formater. Forskjellen mellom disse formatene er bare skilletegnet. I prinsippet kan hvilket som helst tegn brukes som skilletegn. Det vanligste skilletegnet er komma (,), og den filtypen kalles CSV (Comma Separated Values).

Filtype Skilletegnet, navn Skilletegnet, tegn
CSV (Comma Separated Values) Komma ,
TSV (Tab Separated Values) tab
CSV (Colon Separated Values Kolon ;

Filtyper og skilletegn.

DSV-filer er rett og slett tekstfiler der verdiene (kolonnene) er avgrenset med et skilletegn. Hver rad i en DSV-fil er en observasjon. Slik ser en CSV-fil ut:

date, patient, diagnosis
25 May, Adam, Diabetes
25 May, Uma, Rheumatoid arthritis
15 July, Robin, Heart disease

Ved første øyekast ser filen uorganisert ut fordi det mangler synlige kolonner, men faktum er at dette er en fullgod måte å lagre data på, og dessuten kan filen brukes av alle applikasjoner.

Vi kan lese inn CSV-filen ovenfor direkte i R ved hjelp av funksjonen [read_csv()](https://readr.tidyverse.org/reference/read_delim.html) som finnes i pakken readr. Ikke glem å installere pakken readr (install.packages("readr")) hvis du ikke har den.

## Aktiver pakken readr
library(readr)

## Les inn data i CSV-format direkte i R
mina_data <- read_csv("date, patient, diagnosis
                      25 May, Adam, Diabetes
                      25 May, Uma, Rheumatoid arthritis
                      15 July, Robin, Heart disease")

## Se vår data frame
mina_data
## A tibble: 3 × 3
  date    patient diagnosis
  <chr>   <chr>   <chr>
1 25 May  Adam    Diabetes
2 25 May  Uma     Rheumatoid arthritis
3 15 July Robin   Heart disease

Som det fremgår ovenfor, er hver rad i en DSV-fil en rad i en todimensjonal tabell. Legg også merke til at første rad utgjør kolonnenavnene.

De vanligste skilletegnene for DSV-filer er komma (,), tab (\t) og semikolon (;).

Alle applikasjoner for statistikk og data science kan importere og eksportere DSV-filer. Derfor er DSV en enkel og sikker metode for å lagre og overføre data. En ulempe med DSV-filer er at de ikke beholder metadata om variablene. I flere av de mest populære applikasjonene kan man lage metadata for variabler. Metadata er blant annet:

  1. Variabeltype: I Excel, SAS, SPSS osv. kan en kolonne spesifiseres som numerisk, heltall, dato osv.
  2. Label for variabelen: En label (etikett) er en utskriftsvennlig variant av variabelens navn. For eksempel kan variabelen “sysblodtrck” gis labelen ”Systolisk blodtrykk”.
  3. Labels for nivåer på kategoriske variabler: Ofte lagres kategoriske variablers verdier med tall i Excel, SPSS, SAS osv. For eksempel kan variabelen “kjønn” ha verdiene 0 og 1, der 0 er Mann og 1 er kvinne. I de fleste programmer kan også disse nivåene gis en label som er utskriftsvennlig.

Informasjonen i 1, 2 og 3 forsvinner ved eksport til DSV-format. Det er ikke noe stort problem for første punkt (tap av variabeltype) fordi R er usedvanlig god til å gjette variabeltype når data importeres, og dessuten kan du selv konvertere variabeltyper (se forrige kapittel). For punkt 2 og 3 kan tapet av metadata være mer tungvint, fordi man kan måtte gjøre det arbeidet på nytt manuelt.

11.1 Working directory (wd): Din arbeidsmappe

Din working directory er din arbeidsmappe eller ditt arbeidsområde. Dette er stedet (oftest en mappe) der R først leter etter filer og dit R lagrer filer, med mindre du selv ber om et annet sted for dette. Følgende prinsipper kan anbefales:

  • For hver studie/rapport/analyse som du gjør i R, bør du opprette et nytt Prosjekt (Figur 11.1).
  • Når du oppretter et nytt Prosjekt, vil du kunne opprette en ny mappe der prosjektet bor.
  • I denne mappen lagres en fil med filendelsen .rproj. Når du vil arbeide med prosjektet, klikker du bare på den filen for å starte R (Figur 11.2).
  • Legg alle filene dine (Excel, SPSS, SAS, CSV osv.) i den mappen.
Figur 11.1: Opprett et nytt Prosjekt i R.
Figur 11.1: Opprett et nytt Prosjekt i R.
Figur 11.2: RStudio-prosjektfilen har filendelsen .Rproj. Når den startes, starter R med riktig working directory og innstillinger som er lagret fra forrige økt.
Figur 11.2: RStudio-prosjektfilen har filendelsen .Rproj. Når den startes, starter R med riktig working directory og innstillinger som er lagret fra forrige økt.

Hvis dette prinsippet følges, er det svært enkelt å lese inn filer til R og skrive filer fra R til datamaskinen.

Du kan kontrollere hvilken working directory du har med funksjonen getwd():

getwd()
[1] "/Users/Adam/Desktop/DataScienceBook"

Hvis du arbeider i et Prosjekt, bør du ikke bytte working directory. Hvis du ikke arbeider i et Prosjekt, kan du bytte working directory med funksjonen [setwd()](https://rdrr.io/r/base/getwd.html). Nå bytter vi working directory til mappen MyProject på Skrivebordet.

setwd("/Users/Adam/Desktop/MyProject")

Stien til mappen på Skrivebordet kan se annerledes ut på din datamaskin.

11.2 Importere filer fra datamaskinen

Nå skal vi importere filer fra den lokale datamaskinen (den vi arbeider på) ved hjelp av pakkene readr og readxl. Pakken readr brukes for flere ulike filtyper, og readxl brukes for Excel-filer.

install.packages("readr")
install.packages("reaxl")

Aktiver pakkene:

library(readxl)
library(readr)

Faktum er at begge disse pakkene inngår i samlepakken tidyverse, noe som betyr at det holder å installere tidyverse og aktivere pakken. Her nedenfor er linjen for installasjonen kommentert ut fordi pakken allerede er installert på denne datamaskinen.

install.packages("tidyverse")
library(tidyverse)

Tidyverse er et helt økosystem med svært kraftige pakker. Skaperne av tidyverse mente at det var behov for justeringer i Rs data frame-objekt for at det skulle fungere bedre med tidyverse-pakkene. Derfor laget de en variant av data frame som kalles tibble. Pakkene readr og readxl lager data frames av typen tibble!

Pakken readr inneholder følgende funksjoner for å importere data:

  • [read_csv()](https://readr.tidyverse.org/reference/read_delim.html) for å lese inn CSV-filer med komma (,) som skilletegn. I disse filene brukes punktum (.) som desimaltegn for numeriske verdier.
  • [read_csv2()](https://readr.tidyverse.org/reference/read_delim.html) for å lese inn CSV-filer med semikolon (;) som skilletegn. I disse filene brukes komma (,) som desimaltegn for numeriske verdier.
  • [read_tsv()](https://readr.tidyverse.org/reference/read_delim.html) leser inn tab separated files
  • [read_fwf()](https://readr.tidyverse.org/reference/read_fwf.html) leser inn fixed-width files
  • [read_log()](https://readr.tidyverse.org/reference/read_log.html) leser inn web log files
  • [read_delim()](https://readr.tidyverse.org/reference/read_delim.html) universalfunksjon som kan lese alle typer DSV-filer, der skilletegnet må spesifiseres eksplisitt.

Disse funksjonene bruker samme syntaks, noe som betyr at det holder å lære seg én funksjon for å kunne bruke de andre.

Nedenfor ses en CSV-fil som egner seg for import med read_csv():

name, bloodvalue,
Adam, 90.5,
Janet, 80.1,

Nedenfor ses en CSV-fil som egner seg for import med read_csv2():

name; bloodvalue;
Adam; 90,5;
Janet; 80,1;

For å få hjelp med read_csv() skriver du et spørsmålstegn foran funksjonens navn:

?read_csv

Da vises hjelpefunksjonen for alle funksjonene i pakken readr, og dokumentasjonen begynner med read_delim(), som er universalfunksjonen:

Hjelpevinduet i RStudio med readr-dokumentasjonen for read_delim, med beskrivelse og argumentliste under Usage

Under overskriften Usage for [read_csv()](https://readr.tidyverse.org/reference/read_delim.html) ses følgende:

read_csv(
  file,
  col_names = TRUE,
  col_types = NULL,
  col_select = NULL,
  id = NULL,
  locale = default_locale(),
  na = c("", "NA"),
  quoted_na = TRUE,
  quote = "\"",
  comment = "",
  trim_ws = TRUE,
  skip = 0,
  n_max = Inf,
  guess_max = min(1000, n_max),
  name_repair = "unique",
  num_threads = readr_threads(),
  progress = show_progress(),
  show_col_types = should_show_types(),
  skip_empty_rows = TRUE,
  lazy = should_read_lazy()
)

Det første argumentet er file, som er stien til filen og filnavnet. Hvis filen du vil importere, ligger i din working directory, skriver du bare filnavnet. Hvis filen ikke ligger i din working directory, må du oppgi hele stien til filen.

Se på følgende mappestruktur. Øverst er mappen Studie1, og i den ligger filen data1.csv og mappen Projektet. Mappen R-Projekt er vår working directory; i den ligger filene Studie1.rproj, Script.R og data2.csv, samt mappen Enkäter, som i sin tur inneholder data3.csv.

Studie1
│   data1.csv
│
└───Projektet (working directory)
    │   Studie1.rproj
    │   Script.R
    |   data2.csv
    |
    └───Enkäter
    |   data3.csv

Eksempel 1: importer data2.csv, som ligger i vår working directory:

mina_data <- read_csv(file="data2.csv")

Eksempel 2: importer data3.csv, som ligger i mappen Enkäter i working directory:

mina_data <- read_csv(file="Enkäter/data3.csv")

Eksempel 3: importer data1.csv, som ligger ett nivå høyere opp sammenlignet med working directory. For å henvise R til en mappe høyere opp brukes to punktum (..), slik:

mina_data <- read_csv(file="../data1.csv")

R tar altså utgangspunkt i din working directory for å finne filer. Hvis du ikke vil ta utgangspunkt i din working directory, må du oppgi den komplette stien til filen samt filnavnet.

Det er flere ting å merke seg her:

  1. Funksjonen [read_csv()](https://readr.tidyverse.org/reference/read_delim.html) har mange argumenter (file, col_names, col_types, col_select osv.). Likevel oppga vi bare ett eneste argument (file) ovenfor. Det betyr at funksjonen tolererte at vi ikke spesifiserte alle argumentene. De argumentene som vi ikke spesifiserte, settes til sine default-verdier. Hva default-verdien er, fremgår av hjelpefunksjonen (se ovenfor).
  2. I hjelpefunksjonen, under Usage, fremgår det at default for col_names er TRUE, noe som betyr at R spesifiserer den første raden som kolonnenavn.

I funksjonen [read_csv()](https://readr.tidyverse.org/reference/read_delim.html) er file og col_names de to første argumentene. Vi oppgir dette i kommandoen nedenfor:

mina_data <- read_csv(file="data.csv", col_names = TRUE)

Siden de er de første argumentene, kan vi faktisk utelate argumentenes navn og bare spesifisere verdiene direkte:

mina_data <- read_csv("data.csv", TRUE)

Man kan altså hoppe over å navngi argumentene, men da må argumentenes verdier oppgis i nøyaktig samme rekkefølge som argumentene.

Nå leser vi inn data direkte fra skriptet med [read_csv()](https://readr.tidyverse.org/reference/read_delim.html), og deretter skriver vi ut resultatet:

mina_data <- read_csv("name, bloodvalue, sex, education
                      Adam, 90.5, male, 1
                      Janet, 80.1, female, 2")

## Skriv ut resultatet
mina_data
## A tibble: 2 × 4
  name  bloodvalue sex    education
  <chr>      <dbl> <chr>      <dbl>
1 Adam        90.5 male           1
2 Janet       80.1 female         2

Legg merke til følgende:

  • [read_csv()](https://readr.tidyverse.org/reference/read_delim.html) brukte første rad som kolonnenavn.
  • Kolonnene name og sex ble klassifisert som <chr>, som betyr character.
  • bloodvalue er en <dbl>, som betyr double.
  • Kolonnen education klassifiseres som <int>, som er integer. Numeriske verdier uten heltall klassifiseres som integers.

Hvis første rad ikke er kolonnenavnene, brukes argumentet col_names=FALSE. Da får kolonnene navnene X1, X2, X3, …, Xn.

read_csv("Adam, 90.5, male, 1
         Janet, 80.1, female, 2",
         col_names=FALSE)
Rows: 2 Columns: 4
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (2): X1, X3
dbl (2): X2, X4

## A tibble: 2 × 4
  X1       X2 X3        X4
  <chr> <dbl> <chr>  <dbl>
1 Adam   90.5 male       1
2 Janet  80.1 female     2

Du kan spesifisere kolonnenavnene direkte hvis du vil:

mina_data &lt;- read_csv("Adam, 90.5, male, 1
                      Janet, 80.1, female, 2",
                      col_names=c("Namn", "Blodvärde", "Kön", "Utbildning"))
Rows: 2 Columns: 4
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (2): Namn, Kön
dbl (2): Blodvärde, Utbildning
mina_data
## A tibble: 2 × 4
  Namn  Blodvärde Kön    Utbildning
  <chr>     <dbl> <chr>       <dbl>
1 Adam       90.5 male            1
2 Janet      80.1 female          2

11.2.1 Angi manglende verdier

De fleste programmeringsspråk bruker et symbol for manglende data. Opplysninger som mangler, må alltid spesifiseres eksplisitt. R bruker symbolet NA (Not Available) for å markere at en verdi mangler. La oss lese inn de samme dataene igjen, men utelate Adams blodtrykk:

mina_data <- read_csv("Namn, Blodtryck, Kön, Utbildning
                      Adam, , male, 1
                      Janet, 80.1, female, 2")
Rows: 2 Columns: 4
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (2): Namn, Kön
dbl (2): Blodtryck, Utbildning
mina_data
## A tibble: 2 × 4
  Namn  Blodtryck Kön    Utbildning
  <chr>     <dbl> <chr>       <dbl>
1 Adam       NA   male            1
2 Janet      80.1 female          2

Funksjonen [read_csv()](https://readr.tidyverse.org/reference/read_delim.html) registrerer at en verdi mangler, og angir den som NA. Hvis dataene som skal importeres, bruker et spesifikt tegn for å markere manglende verdier, kan du fortelle dette til [read_csv()](https://readr.tidyverse.org/reference/read_delim.html) med argumentet na. I eksemplet nedenfor angir vi at symbolet * markerer manglende verdier:

mina_data <- read_csv("name, bloodvalue, sex, education
                      Adam, *, male, 1
                      Janet, 80.1, female, 2", na="*")
Rows: 2 Columns: 4
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (2): name, sex
dbl (2): bloodvalue, education
mina_data
## A tibble: 2 × 4
  name  bloodvalue sex    education
  <chr>      <dbl> <chr>      <dbl>
1 Adam        NA   male           1
2 Janet       80.1 female         2

De samme prinsippene gjelder for de øvrige funksjonene i pakken readr.

11.2.2 Bytt skilletegn

DSV-filer kan bruke andre skilletegn enn komma. Hvis det er tilfellet, kan man bruke [read_delim()](https://readr.tidyverse.org/reference/read_delim.html) og angi skilletegnet, som i følgende tilfelle er semikolon (;):

mina_data <- read_delim("name; bloodvalue; sex; education
                        Adam; 90.5; male; 1
                        Janet; 80.1; female; 2", delim=";")
Rows: 2 Columns: 4
── Column specification ────────────────────────────────────────────────────────
Delimiter: ";"
chr (4): name,  bloodvalue,  sex,  education
mina_data
## A tibble: 2 × 4
  name                            ` bloodvalue` ` sex`    ` education`
  <chr>                           <chr>         <chr>     <chr>
1 "                        Adam"  " 90.5"       " male"   " 1"
2 "                        Janet" " 80.1"       " female" " 2"

11.2.3 readr sammenlignet med standardfunksjoner i R

Det finnes innebygde funksjoner i R for å lese DSV-filer. Disse funksjonene ligger i pakken base og kalles derfor base-funksjoner. Funksjonen for å lese CSV-filer er read.csv() (som ikke må forveksles med read_csv() i pakken readr) Grunnen til at vi anbefaler funksjonene i readr og readxl, er følgende:

  • readr og readxl er raskere enn base-funksjoner.
  • readr og readxl har en fremdriftsindikator for store filer.

Hvis du skal lese inn svært store filer, er følgende pakker å anbefale:

  • fread() i pakken data.table.
  • vroom() i pakken vroom.

Data frame vs tibble

Når du importerer filer med standardfunksjoner i R, lages objekter i form av data frames. De mer moderne funksjonene som finnes i pakkene readr og readxl, lager i stedet tibbles, som er en type data frame som fungerer smidig med funksjonene i det store biblioteket tidyverse. Du vil sannsynligvis ikke merke om du arbeider med tibbles eller data frames.

11.3 Importere filer fra Excel

Excel-filer kan importeres med tre ulike funksjoner i pakken readxl. Av disse funksjonene holder det å gjøre seg kjent med funksjonen [read_excel()](https://readxl.tidyverse.org/reference/read_excel.html), fordi den fungerer for alle Excel-filer.

Funksjon i pakken readxl Forklaring
[read_excel()](https://readxl.tidyverse.org/reference/read_excel.html) Leser inn alle filer (xls og xlsx).
[read_xls()](https://readxl.tidyverse.org/reference/read_excel.html) Leser inn filer med filendelse xls.
[read_xlsx()](https://readxl.tidyverse.org/reference/read_excel.html) Leser inn filer med filendelse xlsx.

Funksjoner for å importere fra Excel til R.

Anta at vi har filen PatientData.xlsx i vår working directory. I denne filen utgjør første rad kolonnenes navn (variabelnavn). Vi leser inn filen og lagrer den i objektet mina_data:

mina_data <- read_excel(path='PatientData.xlsx',
                        col_names = TRUE)

Anta i stedet at filen PatientData.xlsx har tre ark (eng. sheet), og at vi ønsker å importere med følgende spesifikasjoner:

  • Første rad utgjør kolonnenes navn.
  • Vi vil importere det tredje arket.
  • Vi vil importere maksimalt 500 rader.
  • Vi vil at R skal tolke asterisk (*) som missing data, fordi det var slik vi angav missing data i Excel-filen vår.

Tilsvarende kode blir som følger:

mina_data <- read_excel(path='PatientData.xlsx',
                        col_names = TRUE,
                        sheet=3,
                        n_max=500,
                        na='*')

11.4 Les data fra SAS

SAS-filer bruker filendelsene *.*sas7bdat og .sas7bcat. Disse importeres med pakken haven. Funksjonen heter [read_sas()](https://haven.tidyverse.org/reference/read_sas.html) og fungerer svært likt [read_csv()](https://readr.tidyverse.org/reference/read_delim.html). Et eksempel på import av en SAS-fil følger:

library(haven)
mina_data <- read_sas(data_file='PatientData.sas7bdat')

For å få hjelp med funksjonen [read_sas()](https://haven.tidyverse.org/reference/read_sas.html) brukes kommandoen:

?read_sas

Ikke glem å installere haven (install.packages("haven")) hvis du ikke allerede har gjort det.

11.5 Les data fra SPSS

SPSS-filer bruker filendelsene .sav, .zsav eller .por. Alle disse filene kan importeres med funksjonen [read_spss()](https://haven.tidyverse.org/reference/read_spss.html), som også finnes i pakken haven. Et eksempel på import av en SPSS-fil følger:

library(haven)
mina_data <- read_spss(data_file='PatientData.sav')

For å få hjelp med funksjonen [read_sav()](https://haven.tidyverse.org/reference/read_spss.html) brukes kommandoen:

?read_spss

11.6 Les data fra STATA

STATA-filer bruker filendelsene *.*dta. Disse filene kan importeres med funksjonen [read_stata()](https://haven.tidyverse.org/reference/read_dta.html), som også finnes i pakken haven. Et eksempel på import av en SPSS-fil følger:

library(haven)
mina_data <- read_stata(data_file='PatientData.dta')

For å få hjelp med funksjonen [read_stata()](https://haven.tidyverse.org/reference/read_dta.html) brukes kommandoen:

?read_stata

11.7 Les data fra RedCap eCRF

REDCap (Research Electronic Data Capture) er en nettbasert CRF (Clinical Research Form) som brukes på mange klinikker og universiteter. I REDCap lagres forskningsdata på en server, og det er mange fordeler med å bruke REDCap, særlig i prospektive studier.

Det er mulig å importere data direkte fra REDCap til R med pakken REDCapR. Begynn med å installere og aktivere pakken:

install.packages("REDCapR")

Aktiver pakken:

library(REDCapR)

Hvert prosjekt i REDCap har en URI og en token. Logg inn på REDCap for å hente disse parameterne for prosjektet ditt. Deretter opprettes objektene uri og token slik:

uri   <- "https://bbmc.ouhsc.edu/redcap/api/"
token <- "9A81268476645C4E5F03428B8AC3AA7B"

For å hente hele datasettet (inkludert alle kolonner) brukes kommandoen nedenfor. Husk at vi spesifiserte verdien for objektene uri og token i forrige steg. Vi lagrer datasettet i vårt nye objekt mina_data.

mina_data <- redcap_read(redcap_uri = uri, token = token)$data

Deretter har du en vanlig data frame med hele datasettet fra REDCap.

Mer informasjon om hvordan pakken brukes, finnes i dokumentasjonen.

11.8 Lese data fra databaser (SQL)

Pakkene nedenfor finnes for å lese data fra SQL-databaser. Disse brukes etter de samme prinsippene som REDCap.

  • DBI
  • RMySQL
  • RSQLite
  • RPostgreSQL

11.9 Lese hierarkiske filer (XML, json)

For hierarkiske data finnes pakkene jsonlite for json og xml2 for XML.