Gå till index

Analys med R

0% färdig
0/0 Steps
  1. Analys och forskning med R och Posit (Rstudio)
  2. Grunderna i R och Rstudio
    7 Ämnen
  3. Importera, exportera, spara och ladda data
    5 Ämnen
  4. Strängar och regular expressions (regex)
    1 Ämne
  5. Bearbetning av data med dplyr
    12 Ämnen
  6. Visualisera och presentera
    14 Ämnen
  7. Explorerande analyser
    6 Ämnen
  8. Prediktionsmodeller
    12 Ämnen
  9. Klassisk regressionsanalys
    8 Ämnen
  10. Machine learning (ML) och Artificiell Intelligens (AI)
    9 Ämnen
  11. Prediktionsmodeller: Tidymodels
  12. Hypotestester
    1 Ämne
Avsnitt Progress
0% färdig

Importera data till R

11.0.1 Filformat

Det finns många filformat för rektangulära data (data med kolumner och rader). Sådana data kan också kallas flat files eftersom de är platta i den bemärkelsen att de bara har två dimensioner (rader och kolumner). Vissa applikationer (SPSS, SAS, STATA, Excel, Numbers, etc) använder specifika filformat som inte kan användas av andra applikationer. Detta kan bli ett problem vid överföring av data mellan olika applikationer. För att undvika sådana problem kan man använda ett universellt filformat, vilket innebär att filformatet kan användas av alla program på alla datorer. Det mest universella filformatet är DSV, vilket står för Delimiter Separated Values, eller på svenska avgränsarseparerade värden.

I dessa filer är värdena avgränsade med en separator. Tabellen nedan visar olika DSV format. Skillnaden mellan dessa format är endast separatorn. I princip kan vilket tecken som helst användas som separator. Den vanligaste separatorn är kommatecken (,) och den filtypen kallas CSV (Comma Separated Values).

FiltypSeparatorn, namnSeparatorn, tecken
CSV (Comma Separated Values)Kommatecken,
TSV (Tab Separated Values)tab
CSV (Colon Separated ValuesKolon;
Filtyper och separatorer.

DSV filer är helt enkelt textfiler där värdena (kolumnerna) är avgränsade med en separator. Varje rad i en DSV fil är en observation. Så här ser en CSV fil ut:

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

Vid första anblick ser filen oorganiserad ut eftersom det saknas synliga kolumner men faktum är att detta är ett fullgott sätt att lagra data och dessutom kan filen användas av alla applikationer.

Vi kan läsa in ovanstående CSV fil direkt i R med hjälp av funktionen read_csv() som finns i paketet readr. Glöm inte att installera paketet readr (install.packages("readr")) om du saknar det.

R
# Aktivera paketet readr
library(readr)

# Läs in data i CSV-format direkt 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
Resultat
# 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 framgår ovan är varje rad i en DSV fil en rad i en tvådimensionell tabell. Notera också att första raden utgör kolumnnamnen.

De vanligaste avgränsarna för DSV filer är kommatecken (,), tab (\t) och semikolon (;).

Alla applikationer för statistik och data science kan importera och exportera DSV filer. Därför är DSV en enkel och säker metod för att lagra och överföra data. En nackdel med DSV filer är att de inte behåller metadata om variablerna. I flera av de mest populära applikationerna kan man skapa metadata för variabler. Metadata är bland annat:

  1. Variabeltyp: I Excel, SAS, SPSS, etc, kan en kolumn specificeras som numerisk, heltal, datum, etc.
  2. Label för variabeln: En label (etikett) är en utskriftsvänlig variant av variabelns namn. Exempelvis kan variabeln “sysblodtrck” ges labeln”Systoliskt blodtryck”.
  3. Labels för nivåer på kategoriska variabler: Ofta sparas kategoriska variablers värden med siffror i Excel, SPSS, SAS, etc. Exempelvis kan variabeln “kön” ha värdena 0 och 1, där 0 är Man och 1 är kvinna. I flertalet program kan även dessa nivåer ges en label som är utskriftsvänlig.

Informationen i 1, 2 och 3 försvinner vid export till DSV format. Det är inget stort problem för första punkten (förlust av variabeltyp) eftersom R är utomordentligt bra på att gissa variabeltyp när data importeras och dessutom kan du själv konvertera variabeltyper (se föregående kapitel). För punkt 2 och 3 kan förlusten av metadata vara mer besvärlig eftersom man kan behöva göra om det arbetet manuellt.

11.1 Working directory (wd): Din arbetsmapp

Din working director är din arbetsmapp eller arbetsyta. Detta är platsen (oftast en mapp) där R först letar efter filer och dit R sparar filer, såvida du inte självmant begär en annan plats för detta. Följande principer kan rekommenderas:

  • För varje studie/rapport/analys som du gör i R bör du skapa ett nytt Projekt (Figur 11.1).
  • När du skapar ett nytt Projekt kommer du kunna skapa en ny mapp där projektet bor.
  • I denna mapp sparas en fil med filändelsen .rproj. När du vill arbeta med projektet klickar du bara på den filen för att starta R (Figur 11.2).
  • Lägg alla dina filer (Excel, SPSS, SAS, CSV, etc) i den mappen.
Figur 11.1: Skapa ett nytt Projekt i R.
Figur 11.2: Rstudio Projektfil har filändelsen .Rproj. När den startas så startar R med korrekt working direktory och inställningar som sparats från föregående session.

Om denna principen följs är det mycket enkelt att läsa in filer till R och skriva filer från R till datorn.

Du kan kontrollera vilken working directory du har genom funktionen getwd():

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

Om du arbetar i ett Projekt bör du inte byta working directory. Om du inte arbetar i ett Projekt kan du byta working directory med funktionen setwd(). Nu byter vi working directory till mappen MyProject på Skrivbordet.

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

Sökvägen till mappen på Skrivbordet kan se annorlunda ut på din dator.

11.2 Importera filer från datorn

Nu ska vi importera filer från den lokala datorn (den vi arbetar med) med hjälp av paketen readr och readxl. Paketet readr används för flera olika filtyper och readxl används för Excelfiler.

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

Aktivera paketen:

R
library(readxl)
library(readr)

Faktum är att båda dessa paket ingår i samlingspaketet tidyverse, vilket innebär att det räcker med att installera tidyverse och aktivera paketet. Här nedan har raden för installationen kommenterats ut eftersom paketet redan är installerat på denna datorn.

R
install.packages("tidyverse")

library(tidyverse)

Tidyverse är ett helt ekosystem med mycket kraftfulla paket. Skaparna av tidyverse ansåg att det behövde göras justeringar i Rs data frame objekt för att fungera bättre med tidyverse-paketen. Därför skapade de en variant av data frame som kallas tibble. Paketen readr och readxl skapar data frames av typen tibble!

Paketet readr innehåller följande funktioner för att importera data:

  • read_csv() för att läsa in CSV filer med kommatecken (,) som separator. I dessa filer används punkt (.) som decimaltecken för numeriska värden.
  • read_csv2() för att läsa in CSV filer med semikolon (;) som separator. I dessa filer används kommatecken (,) som decimaltecken för numeriska värden.
  • read_tsv() läser in tab separated files
  • read_fwf() läser in fixed-width files
  • read_log() läser in web log files
  • read_delim() universalfunktion som kan läsa alla typer av DSV filer med separatorn måste specificeras explicit.

Dessa funktioner använder samma syntax, vilket innebär att det räcker med att lära sig en funktion för att kunna använda de andra.

Nedan ses en CSV fil som är lämplig för import med read_csv():

CSV lämplig för read_csv()
name, bloodvalue,
Adam, 90.5,
Janet, 80.1,

Nedan ses en CSV fil som är lämplig för import med read_csv2():

CSV lämplig för read_csv2()
name; bloodvalue;
Adam; 90,5;
Janet; 80,1;

För att få hjälp med read_csv() skriver du ett frågetecken framför funktionens namn:

R
?read_csv

Då presenteras hjälpfunktionen för alla funktioner i paketet readr och dokumentationen börjar med read_delim() som är universalfunktionen:

Figur 11.3: Hjälp till read_delim(), read_csv(), read_csv2(), etc.

Under rubriken Usage för read_csv() ses följande:

R
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örsta argumentet är file, vilket är sökvägen till filen och filnamnet. Om filen du vill importera finns i din working directory skriver du bara filnamnet. Om filen inte finns i din working directory måste du ange hela sökvägen till filen.

Betrakta följande mappstruktur. Högst upp är mappen Studie1 och i den finns filen data1.csv och mappen Projektet. Mappen R-Projekt är vår working directory; i den finns filerna Studie1.rprojScript.R och data2.csv, samt mappen Enkäter, som i sin tur innehåller data3.csv.

Mappstruktur
Studie1
data1.csv    

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

Exempel 1: importera data2.csv som finns i vår working directory:

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

Exempel 2: importera data3.csv som finns i mappen Enkäter i working directory:

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

Exempel 3: importera data1.csv som finns en nivå högre upp jämfört med working directory. För att hänvisa R till en mapp högre upp används två punkter (..), enligt följande:

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

R utgår således från din working directory för att hitta filer. Om du inte vill utgå ifrån din working directory behöver du ange den kompletta sökvägen till filen samt filnamnet.

Det finns flera saker att notera här:

  1. Funktionen read_csv() har många argument (file, col_names, col_types, col_select, etc). Trots detta angav vi bara ett enda argument (file) ovan. Det innebär att funktionen tolererade att vi inte specificerar alla argument. De argument som vi inte specificierade ställs till sina default-värden. Vad defaultvärdet är framgår av hjälpfunktionen (se ovan).
  2. I hjälpfunktionen, under Usage, framgår att default för col_names är TRUE, vilket innebär att R specificerar den första raden som kolumnnamn.

I funktionen read_csv() är file och col_names de två första argumenten. Vi anger detta i kommandot nedan:

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

Eftersom de är de första argumenten kan vi faktiskt utelämna argumentens namn och bara specificera värdena direkt:

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

Man kan således hoppa över att namnge argumenten men då måste argumentens värden anges i exakt samma ordning som argumenten.

Nu läser vi in data direkt från skriptet med read_csv() och därefter skriver vi ut resultatet:

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

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

Notera följande:

  • read_csv() använde första raden som kolumnnamn.
  • Kolumnerna name och sex klassificerades som <chr> vilket betyder character.
  • bloodvalue är en <dbl> vilket betyder double.
  • Kolumnen education klassificeras som <int> vilket är integer. Numeriska värden utan heltal klassificeras som integers.

Om första raden inte är kolumnnamnen används argumentet col_names=FALSE. Då får kolumnerna namnen X1, X2, X3, …, Xn.

R
read_csv("Adam, 90.5, male, 1
         Janet, 80.1, female, 2",
         col_names=FALSE)
Resultat
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 specificera kolumnnamnen direkt o du vill:

R
mina_data <- read_csv("Adam, 90.5, male, 1
                      Janet, 80.1, female, 2",
                      col_names=<a href="https://rdrr.io/r/base/c.html" target="_blank">c</a>("Namn", "Blodvärde", "Kön", "Utbildning"))
Resultat
Rows: 2 Columns: 4
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (2): Namn, Kön
dbl (2): Blodvärde, Utbildning
R
mina_data
Resultat
# 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 Ange saknade värden

De flesta programmeringsspråk använder någon symbol för saknade data. Uppgifter som saknas måste alltid specificeras explicit. R använder symbolen NA (Not Available) för att markera att ett värde saknas. Låt oss läsa i samma data igen men utelämna Adams blodtryck:

R
mina_data <- read_csv("Namn, Blodtryck, Kön, Utbildning
                      Adam, , male, 1
                      Janet, 80.1, female, 2")
Resultat
Rows: 2 Columns: 4
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (2): Namn, Kön
dbl (2): Blodtryck, Utbildning
R
mina_data
Resultat
# 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() noterar att det saknas ett värde och anger det som NA. Om de data som ska importeras använder ett specifikt tecken för att markera saknade värden kan du berätta detta för read_csv() med argumentet na. I nedanstående exempel anger vi att symbolen * markerar saknade värden:

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

Samma principer gäller för övriga funktioner i paketet readr.

11.2.2 Byt separator

DSV filer kan använda andra separatorer än kommatecken. Om så är fallet kan man använda read_delim() och ange separatorn, som i följande fall är semikolon (;):

R
mina_data <- read_delim("name; bloodvalue; sex; education
                        Adam; 90.5; male; 1
                        Janet; 80.1; female; 2", delim=";")
Resultat
Rows: 2 Columns: 4
── Column specification ────────────────────────────────────────────────────────
Delimiter: ";"
chr (4): name,  bloodvalue,  sex,  education
R
mina_data
Resultat
# 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 jämfört med standardfunktioner i R

Det finns inbyggda funktioner i R för att läsa DSV-filer. Dessa funktioner finns i paketet base och kallas därför base funktioner. Funktionen för att läsa CSV filer är read.csv() (som inte skall förväxlas med read_csv() i paketet readr) Anledningen till att vi rekommenderar funktionerna i readr och readxl är följande:

  • readr och readxl är snabbare än base funktioner.
  • readr och readxl har en förloppsindikator för stora filer.

Om du ska läsa in mycket stora filer är följande paket att rekommendera:

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

Data frame vs tibble

När du importerar filer med standardfunktioner i R så skapas objekt i form av data frames. De modernare funktionerna som finns i paketen readr och readxl skapar istället tibbles, vilket är en typ av data frame som fungerar smidigt med funktionerna i det stora biblioteket tidyverse. Du kommer sannolikt inte märka när du arbetar med tibbles eller data frames.

11.3 Importera filer från Excel

Excelfiler kan importeras med tre olika funktioner i paketet readxl. Av dessa funktioner räcker det med att bekanta sig med funktionen read_excel() eftersom den fungerar för alla Excelfiler.

Funktion i paketet readxlFörklaring
read_excel()Läser in alla filer (xls och xlsx).
read_xls()Läser in in filer med filändelse xls.
read_xlsx()Läser in in filer med filändelse xlsx.
Funktioner för att importera från Excel till R.

Ponera att vi har filen PatientData.xlsx i vår working directory. I denna filen utgör första raden kolumnernas namn (variabelnamn). Vi läser in filen och sparar det till objektet mina_data:

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

Ponera istället att filen PatientData.xlsx har tre blad (eng. sheet) och vi önskar importera med följande specifikationer:

  • Första raden utgör kolumnernas namn.
  • Vi vill importera det tredje bladet.
  • Vi vill importera maximalt 500 rader.
  • Vi vill att R ska tolka asterix (*) som missing data eftersom det var så vi angav missing data i vår Excelfil.

Motsvarande kod blir som följer:

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

11.4 Läs data från SAS

SAS filer använder filändelserna .sas7bdat och .sas7bcat. Dessa importeras med paketet haven. Funktionen heter read_sas() och fungerar väldigt likt read_csv(). Exempel på import av en SAS-fil följer:

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

För att få hjälp med read_sas() funktionen används kommandot:

R
?read_sas

Glöm inte att installera haven (install.packages("haven")) om du inte redan gjort det.

11.5 Läs data från SPSS

SPSS filer använder filändelserna .sav, .zsav eller .por. Alla dessa filer kan importeras med funktionen read_spss() som också finns i paketet haven. Exempel på import av en SPSS-fil följer:

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

För att få hjälp med read_sav() funktionen används kommandot:

R
?read_spss

11.6 Läs data från STATA

STATA filer använder filändelserna .dta. Dessa filer kan importeras med funktionen read_stata() som också finns i paketet haven. Exempel på import av en SPSS-fil följer:

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

För att få hjälp med read_stata() funktionen används kommandot:

R
?read_stata

11.7 Läs data från RedCap eCRF

REDCap (Research Electronic Data Capture) är en webbaserad CRF (Clinical Research Form) som används på många kliniker och universitet. I REDCap lagras forskningsdata på en server och det finns många fördelar med att använda REDCap, särskilt i prospektiva studier

Det är möjligt att importera data direkt från REDCap till R med paketet REDCapR. Börja med att installera och aktivera paketet:

R
install.packages("REDCapR")

Aktivera paketet:

R
library(REDCapR)

Varje projekt i REDCap har en URI och en token. Logga in på REDCap för att hämta dessa parametrar för ditt projekt. Därefter skapas objekten uri och token enligt följande:

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

För att hämta hela datamängden (inklusive alla kolumner) används nedanstående kommando. Erinra att vi specificerat värdet för objekten uri och token i steget innan. Vi sparar datamängden i vårt nya objekt mina_data.

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

Därefter har du en vanlig data frame med hela datamängden från REDCap.

Mer information om paketet används finns i dokumentationen.

11.8 Läsa data från databaser (SQL)

Nedanstående paket finns för att läsa data från SQL-databaser. Dessa används enligt samma principer som REDCap.

  • DBI
  • RMySQL
  • RSQLite
  • RPostgreSQL

11.9 Läsa hierarkiska filer (XML, json)

För hierarkiska data finns paketen jsonlite för json, och xml2 för XML.