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 diseaseVed 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 diseaseSom 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:
- Variabeltype: I Excel, SAS, SPSS osv. kan en kolonne spesifiseres som numerisk, heltall, dato osv.
- Label for variabelen: En label (etikett) er en utskriftsvennlig variant av variabelens navn. For eksempel kan variabelen “sysblodtrck” gis labelen ”Systolisk blodtrykk”.
- 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.


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_csvDa vises hjelpefunksjonen for alle funksjonene i pakken readr, og dokumentasjonen begynner med read_delim(), som er universalfunksjonen:

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.csvEksempel 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:
- 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). - 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 2Legg merke til følgende:
[read_csv()](https://readr.tidyverse.org/reference/read_delim.html)brukte første rad som kolonnenavn.- Kolonnene
nameogsexble klassifisert som<chr>, som betyr character. bloodvalueer en<dbl>, som betyr double.- Kolonnen
educationklassifiseres 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 2Du kan spesifisere 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 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, 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 2Funksjonen [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, 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 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, 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 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_sasIkke 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_spss11.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_stata11.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)$dataDeretter 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.
DBIRMySQLRSQLiteRPostgreSQL
11.9 Lese hierarkiske filer (XML, json)
For hierarkiske data finnes pakkene jsonlite for json og xml2 for XML.