Importere data

Importere data til R

11.0.1 Filformater

Der findes mange filformater til rektangulære data (data med kolonner og rækker). Sådanne data kan også kaldes flat files, fordi de er flade i den forstand, at de kun har to dimensioner (rækker og kolonner). Nogle applikationer (SPSS, SAS, STATA, Excel, Numbers osv.) bruger specifikke filformater, som ikke kan bruges af andre applikationer. Det kan blive et problem, når data skal overføres mellem forskellige applikationer. For at undgå sådanne problemer kan man bruge et universelt filformat, hvilket betyder, at filformatet kan bruges af alle programmer på alle computere. Det mest universelle filformat er DSV, som står for Delimiter Separated Values, eller på dansk afgrænserseparerede værdier.

I disse filer er værdierne adskilt af en separator. Tabellen nedenfor viser forskellige DSV-formater. Forskellen mellem disse formater er udelukkende separatoren. I princippet kan et hvilket som helst tegn bruges som separator. Den mest almindelige separator er komma (,), og den filtype kaldes CSV (Comma Separated Values).

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

Filtyper og separatorer.

DSV-filer er ganske enkelt tekstfiler, hvor værdierne (kolonnerne) er adskilt af en separator. Hver række i en DSV-fil er en observation. Sådan ser en CSV-fil ud:

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

Ved første øjekast ser filen uorganiseret ud, fordi der ikke er synlige kolonner, men faktisk er dette en fuldt ud brugbar måde at lagre data på, og desuden kan filen bruges af alle applikationer.

Vi kan indlæse ovenstående CSV-fil direkte i R ved hjælp af funktionen [read_csv()](https://readr.tidyverse.org/reference/read_delim.html), som findes i pakken readr. Glem ikke at installere pakken readr (install.packages("readr")), hvis du ikke har den.

## Aktivér pakken readr
library(readr)

## Indlæs 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 vores 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 række i en DSV-fil en række i en todimensionel tabel. Bemærk også, at den første række udgør kolonnenavnene.

De mest almindelige afgrænsere for DSV-filer er komma (,), tab (\t) og semikolon (;).

Alle applikationer til statistik og data science kan importere og eksportere DSV-filer. Derfor er DSV en enkel og sikker metode til at lagre og overføre data. En ulempe ved DSV-filer er, at de ikke bevarer metadata om variablerne. I flere af de mest populære applikationer kan man oprette metadata for variabler. Metadata er blandt andet:

  1. Variabeltype: I Excel, SAS, SPSS osv. kan en kolonne specificeres som numerisk, heltal, dato osv.
  2. Label for variablen: En label (etiket) er en udskriftsvenlig udgave af variablens navn. For eksempel kan variablen “sysblodtrck” få labelen ”Systolisk blodtryk”.
  3. Labels for niveauer af kategoriske variabler: Ofte gemmes kategoriske variablers værdier som tal i Excel, SPSS, SAS osv. For eksempel kan variablen “køn” have værdierne 0 og 1, hvor 0 er Mand og 1 er kvinde. I de fleste programmer kan disse niveauer også få en label, som er udskriftsvenlig.

Informationen i 1, 2 og 3 forsvinder ved eksport til DSV-format. Det er ikke et stort problem for det første punkt (tab af variabeltype), fordi R er særdeles god til at gætte variabeltype, når data importeres, og desuden kan du selv konvertere variabeltyper (se foregående kapitel). For punkt 2 og 3 kan tabet af metadata være mere besværligt, fordi man kan blive nødt til at gentage det arbejde manuelt.

11.1 Working directory (wd): Din arbejdsmappe

Din working directory er din arbejdsmappe eller dit arbejdsområde. Det er det sted (oftest en mappe), hvor R først leder efter filer, og hvor R gemmer filer, medmindre du selv beder om et andet sted til dette. Følgende principper kan anbefales:

  • For hver undersøgelse/rapport/analyse, som du laver i R, bør du oprette et nyt Projekt (Figur 11.1).
  • Når du opretter et nyt Projekt, vil du kunne oprette en ny mappe, hvor projektet bor.
  • I denne mappe gemmes en fil med filendelsen .rproj. Når du vil arbejde med projektet, klikker du bare på den fil for at starte R (Figur 11.2).
  • Læg alle dine filer (Excel, SPSS, SAS, CSV osv.) i den mappe.
Figur 11.1: Opret et nyt Projekt i R.
Figur 11.1: Opret et nyt Projekt i R.
Figur 11.2: RStudio-projektfilen har filendelsen .Rproj. Når den åbnes, starter R med korrekt working directory og de indstillinger, der blev gemt fra den foregående session.
Figur 11.2: RStudio-projektfilen har filendelsen .Rproj. Når den åbnes, starter R med korrekt working directory og de indstillinger, der blev gemt fra den foregående session.

Hvis dette princip følges, er det meget enkelt at indlæse filer i R og skrive filer fra R til computeren.

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

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

Hvis du arbejder i et Projekt, bør du ikke skifte working directory. Hvis du ikke arbejder i et Projekt, kan du skifte working directory med funktionen [setwd()](https://rdrr.io/r/base/getwd.html). Nu skifter vi working directory til mappen MyProject på Skrivebordet.

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

Stien til mappen på Skrivebordet kan se anderledes ud på din computer.

11.2 Importere filer fra computeren

Nu skal vi importere filer fra den lokale computer (den, vi arbejder på) ved hjælp af pakkerne readr og readxl. Pakken readr bruges til flere forskellige filtyper, og readxl bruges til Excel-filer.

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

Aktivér pakkerne:

library(readxl)
library(readr)

Faktisk indgår begge disse pakker i samlepakken tidyverse, hvilket betyder, at det er nok at installere tidyverse og aktivere pakken. Herunder er linjen til installationen kommenteret ud, fordi pakken allerede er installeret på denne computer.

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

Tidyverse er et helt økosystem med meget kraftfulde pakker. Skaberne af tidyverse mente, at der var behov for justeringer i R's data frame-objekt, for at det kunne fungere bedre med tidyverse-pakkerne. Derfor skabte de en variant af data frame, som kaldes tibble. Pakkerne readr og readxl skaber data frames af typen tibble!

Pakken readr indeholder følgende funktioner til at importere data:

  • [read_csv()](https://readr.tidyverse.org/reference/read_delim.html) til at indlæse CSV-filer med komma (,) som separator. I disse filer bruges punktum (.) som decimaltegn for numeriske værdier.
  • [read_csv2()](https://readr.tidyverse.org/reference/read_delim.html) til at indlæse CSV-filer med semikolon (;) som separator. I disse filer bruges komma (,) som decimaltegn for numeriske værdier.
  • [read_tsv()](https://readr.tidyverse.org/reference/read_delim.html) indlæser tab separated files
  • [read_fwf()](https://readr.tidyverse.org/reference/read_fwf.html) indlæser fixed-width files
  • [read_log()](https://readr.tidyverse.org/reference/read_log.html) indlæser web log files
  • [read_delim()](https://readr.tidyverse.org/reference/read_delim.html) universalfunktion, som kan læse alle typer DSV-filer, hvor separatoren skal specificeres eksplicit.

Disse funktioner bruger den samme syntaks, hvilket betyder, at det er nok at lære én funktion for at kunne bruge de andre.

Nedenfor ses en CSV-fil, som er egnet til import med read_csv():

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

Nedenfor ses en CSV-fil, som er egnet til import med read_csv2():

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

For at få hjælp til read_csv() skriver du et spørgsmålstegn foran funktionens navn:

?read_csv

Så vises hjælpefunktionen for alle funktioner i pakken readr, og dokumentationen begynder med read_delim(), som er universalfunktionen:

Hjælpevinduet i RStudio med readr-dokumentationen 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 argument er file, som er stien til filen og filnavnet. Hvis den fil, du vil importere, findes i din working directory, skriver du bare filnavnet. Hvis filen ikke findes i din working directory, skal du angive hele stien til filen.

Betragt følgende mappestruktur. Øverst er mappen Studie1, og i den findes filen data1.csv og mappen Projektet. Mappen R-Projekt er vores working directory; i den findes filerne Studie1.rproj, Script.R og data2.csv samt mappen Enkäter, som igen indeholder data3.csv.

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

Eksempel 1: importér data2.csv, som findes i vores working directory:

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

Eksempel 2: importér data3.csv, som findes i mappen Enkäter i working directory:

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

Eksempel 3: importér data1.csv, som ligger ét niveau højere oppe end working directory. For at henvise R til en mappe højere oppe bruges to punktummer (..) på følgende måde:

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

R tager således udgangspunkt i din working directory for at finde filer. Hvis du ikke vil tage udgangspunkt i din working directory, skal du angive den komplette sti til filen samt filnavnet.

Der er flere ting at bemærke her:

  1. Funktionen [read_csv()](https://readr.tidyverse.org/reference/read_delim.html) har mange argumenter (file, col_names, col_types, col_select osv.). Alligevel angav vi kun et enkelt argument (file) ovenfor. Det betyder, at funktionen tolererede, at vi ikke specificerede alle argumenter. De argumenter, som vi ikke specificerede, sættes til deres default-værdier. Hvad default-værdien er, fremgår af hjælpefunktionen (se ovenfor).
  2. I hjælpefunktionen, under Usage, fremgår det, at default for col_names er TRUE, hvilket betyder, at R specificerer den første række som kolonnenavne.

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

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

Da de er de første argumenter, kan vi faktisk udelade argumenternes navne og bare specificere værdierne direkte:

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

Man kan således springe over at navngive argumenterne, men så skal argumenternes værdier angives i nøjagtig samme rækkefølge som argumenterne.

Nu indlæser vi data direkte fra scriptet med [read_csv()](https://readr.tidyverse.org/reference/read_delim.html), og derefter udskriver vi resultatet:

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

## Udskriv 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

Bemærk følgende:

  • [read_csv()](https://readr.tidyverse.org/reference/read_delim.html) brugte den første række som kolonnenavne.
  • Kolonnerne name og sex blev klassificeret som <chr>, hvilket betyder character.
  • bloodvalue er en <dbl>, hvilket betyder double.
  • Kolonnen education klassificeres som <int>, hvilket er integer. Numeriske værdier uden heltal klassificeres som integers.

Hvis den første række ikke er kolonnenavnene, bruges argumentet col_names=FALSE. Så får kolonnerne 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 specificere 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 Angiv manglende værdier

De fleste programmeringssprog bruger et eller andet symbol for manglende data. Oplysninger, der mangler, skal altid specificeres eksplicit. R bruger symbolet NA (Not Available) til at markere, at en værdi mangler. Lad os indlæse de samme data igen, men udelade Adams blodtryk:

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

Funktionen [read_csv()](https://readr.tidyverse.org/reference/read_delim.html) registrerer, at der mangler en værdi, og angiver den som NA. Hvis de data, der skal importeres, bruger et specifikt tegn til at markere manglende værdier, kan du fortælle [read_csv()](https://readr.tidyverse.org/reference/read_delim.html) dette med argumentet na. I nedenstående eksempel angiver vi, at symbolet * markerer manglende værdier:

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 principper gælder for de øvrige funktioner i pakken readr.

11.2.2 Skift separator

DSV-filer kan bruge andre separatorer end komma. Hvis det er tilfældet, kan man bruge [read_delim()](https://readr.tidyverse.org/reference/read_delim.html) og angive separatoren, som i det følgende tilfælde 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 standardfunktioner i R

Der findes indbyggede funktioner i R til at læse DSV-filer. Disse funktioner findes i pakken base og kaldes derfor base-funktioner. Funktionen til at læse CSV-filer er read.csv() (som ikke må forveksles med read_csv() i pakken readr). Grunden til, at vi anbefaler funktionerne i readr og readxl, er følgende:

  • readr og readxl er hurtigere end base-funktioner.
  • readr og readxl har en statusindikator for store filer.

Hvis du skal indlæse meget store filer, kan følgende pakker anbefales:

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

Data frame vs tibble

Når du importerer filer med standardfunktioner i R, oprettes objekter i form af data frames. De mere moderne funktioner, som findes i pakkerne readr og readxl, opretter i stedet tibbles, som er en type data frame, der fungerer smidigt med funktionerne i det store bibliotek tidyverse. Du vil sandsynligvis ikke mærke, om du arbejder med tibbles eller data frames.

11.3 Importere filer fra Excel

Excel-filer kan importeres med tre forskellige funktioner i pakken readxl. Af disse funktioner er det nok at gøre sig bekendt med funktionen [read_excel()](https://readxl.tidyverse.org/reference/read_excel.html), fordi den fungerer til alle Excel-filer.

Funktion i pakken readxl Forklaring
[read_excel()](https://readxl.tidyverse.org/reference/read_excel.html) Indlæser alle filer (xls og xlsx).
[read_xls()](https://readxl.tidyverse.org/reference/read_excel.html) Indlæser filer med filendelsen xls.
[read_xlsx()](https://readxl.tidyverse.org/reference/read_excel.html) Indlæser filer med filendelsen xlsx.

Funktioner til at importere fra Excel til R.

Antag, at vi har filen PatientData.xlsx i vores working directory. I denne fil udgør den første række kolonnernes navne (variabelnavne). Vi indlæser filen og gemmer den i objektet mina_data:

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

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

  • Den første række udgør kolonnernes navne.
  • Vi vil importere det tredje ark.
  • Vi vil importere højst 500 rækker.
  • Vi vil have R til at tolke asterisk (*) som missing data, fordi det var sådan, vi angav missing data i vores Excel-fil.

Den tilsvarende kode bliver som følger:

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

11.4 Læs data fra SAS

SAS-filer bruger filendelserne *.*sas7bdat og .sas7bcat. De importeres med pakken haven. Funktionen hedder [read_sas()](https://haven.tidyverse.org/reference/read_sas.html) og fungerer meget som [read_csv()](https://readr.tidyverse.org/reference/read_delim.html). Et eksempel på import af en SAS-fil følger:

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

For at få hjælp til funktionen [read_sas()](https://haven.tidyverse.org/reference/read_sas.html) bruges kommandoen:

?read_sas

Glem ikke at installere haven (install.packages("haven")), hvis du ikke allerede har gjort det.

11.5 Læs data fra SPSS

SPSS-filer bruger filendelserne .sav, .zsav eller .por. Alle disse filer kan importeres med funktionen [read_spss()](https://haven.tidyverse.org/reference/read_spss.html), som også findes i pakken haven. Et eksempel på import af en SPSS-fil følger:

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

For at få hjælp til funktionen [read_sav()](https://haven.tidyverse.org/reference/read_spss.html) bruges kommandoen:

?read_spss

11.6 Læs data fra STATA

STATA-filer bruger filendelsen *.*dta. Disse filer kan importeres med funktionen [read_stata()](https://haven.tidyverse.org/reference/read_dta.html), som også findes i pakken haven. Et eksempel på import af en SPSS-fil følger:

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

For at få hjælp til funktionen [read_stata()](https://haven.tidyverse.org/reference/read_dta.html) bruges kommandoen:

?read_stata

11.7 Læs data fra RedCap eCRF

REDCap (Research Electronic Data Capture) er en webbaseret CRF (Clinical Research Form), som bruges på mange klinikker og universiteter. I REDCap lagres forskningsdata på en server, og der er mange fordele ved at bruge REDCap, især i prospektive studier

Det er muligt at importere data direkte fra REDCap til R med pakken REDCapR. Begynd med at installere og aktivere pakken:

install.packages("REDCapR")

Aktivér pakken:

library(REDCapR)

Hvert projekt i REDCap har en URI og en token. Log ind på REDCap for at hente disse parametre for dit projekt. Derefter oprettes objekterne uri og token på følgende måde:

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

For at hente hele datasættet (inklusive alle kolonner) bruges nedenstående kommando. Husk, at vi har specificeret værdien for objekterne uri og token i det foregående trin. Vi gemmer datasættet i vores nye objekt mina_data.

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

Derefter har du en almindelig data frame med hele datasættet fra REDCap.

Mere information om, hvordan pakken bruges, findes i dokumentationen.

11.8 Læse data fra databaser (SQL)

Følgende pakker findes til at læse data fra SQL-databaser. De bruges efter de samme principper som REDCap.

  • DBI
  • RMySQL
  • RSQLite
  • RPostgreSQL

11.9 Læse hierarkiske filer (XML, json)

Til hierarkiske data findes pakkerne jsonlite til json og xml2 til XML.