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 diseaseVed 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 diseaseSom 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:
- Variabeltype: I Excel, SAS, SPSS osv. kan en kolonne specificeres som numerisk, heltal, dato osv.
- Label for variablen: En label (etiket) er en udskriftsvenlig udgave af variablens navn. For eksempel kan variablen “sysblodtrck” få labelen ”Systolisk blodtryk”.
- 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.


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_csvSå vises hjælpefunktionen for alle funktioner i pakken readr, og dokumentationen begynder med read_delim(), som er universalfunktionen:

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.csvEksempel 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:
- 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). - 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 2Bemærk følgende:
[read_csv()](https://readr.tidyverse.org/reference/read_delim.html)brugte den første række som kolonnenavne.- Kolonnerne
nameogsexblev klassificeret som<chr>, hvilket betyder character. bloodvalueer en<dbl>, hvilket betyder double.- Kolonnen
educationklassificeres 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 2Du kan specificere kolonnenavnene direkte, hvis du vil:
mina_data <- 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, Utbildningmina_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 211.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, Utbildningmina_data## A tibble: 2 × 4
Namn Blodtryck Kön Utbildning
<chr> <dbl> <chr> <dbl>
1 Adam NA male 1
2 Janet 80.1 female 2Funktionen [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, educationmina_data## A tibble: 2 × 4
name bloodvalue sex education
<chr> <dbl> <chr> <dbl>
1 Adam NA male 1
2 Janet 80.1 female 2De 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, educationmina_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_sasGlem 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_spss11.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_stata11.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)$dataDerefter 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.
DBIRMySQLRSQLiteRPostgreSQL
11.9 Læse hierarkiske filer (XML, json)
Til hierarkiske data findes pakkerne jsonlite til json og xml2 til XML.