I denne vejledning vil vi gennemgå noget af den mest basale syntaks i programmeringssproget R, og vi vil skrabe i overfladen på pakken mosaic
, som vi kommer til at benytte en del igennem kurset.
Vejledningen er lavet, da tidligere studerende har efterspurgt en kort introduktion til R, før selve kurset går i gang. Men da det ikke er en forudsætning for kurset, at man har arbejdet med R eller andre programmeringssprog tidligere, så vil vi stadig gøre vores bedste for at introducere det nødvendige R i løbet af kurset. Intentionen med vejledningen er derfor ikke at give en dybdegående introduktion, men blot at lade den studerende bruge R i nogle forskellige sammenhænge, så det ikke virker som en fuldstændigt ukendt verden, når kurset begynder.
R er et programmeringssprog og en software, der er specialiseret til brug indenfor statistik og dataanalyse. Man kan se det som en ekstra avanceret lommeregner, der gennem et tilpasset sprog kan instrueres i at udføre specialiserede beregninger. Vi siger tit, at vi skriver R-kode, når vi skriver en række instrukser i sproget R.
RStudio er et såkaldt Interactive Development Environment (IDE), hvori vi nemt kan arbejde med R og køre vores R-kode.
R-softwaren kommer med nogle basale indbyggede funktioner, men man har mulighed for at hente udvidelser gennem såkaldte pakker (og man kan evt. selv lave nye pakker).
For at benytte en pakkes funktionalitet må vi først installere den, hvilket enten kan gøres med peg-og-klik i en menu i RStudio eller med en kommando på formen install.packages('pakkenavn')
. Installation af pakken skal kun gøres een gang på en given computer.
Når pakken er installeret, kan man tilgå dens indhold. Ønsker man f.eks. at tilgå en funktion eller et datasæt fra pakken, kan man skrive pakkenavn::funktionsnavn
eller pakkenavn::datanavn
. Hvis man skal bruge en pakkes indhold mange gange, så er det dog ret omstændigt hele tiden at skrive pakkenavn::
, og så kan man i stedet frigive hele pakkens indhold for vores R-session med en kommando på formen library(pakkenavn)
eller library("pakkenavn")
, hvor den første version uden anførselstegn er mest gængs. Herefter vil vi kunne tilgå pakkens funktioner m.m. ved blot ved skrive funktionsnavnet. Hvis vi starter en ny R session (lukker ned og starter igen osv) så skal man igen bruge library
-kommandoen for at frigive pakkens indhold.
palmerpenguins
, men da det er det eneste, vi vil bruge fra den pakke, så vil vi undlade at bruge library
-funktionen. Hvordan kan vi tilgå datasættet penguins
fra pakken palmerpenguins
?
# Indtast den nødvendige kode for at hente datasættet penguins fra pakken palmerpenguins:
Tip: Hvis blot vi har installeret en pakke, så kan vi tilgå dens indhold med syntaksen pakkenavn::datanavn
.
palmerpenguins::penguins
Med koden palmerpenguins::penguins
tilgår vi kun datasættet penguins
, men vi vil ofte gerne gemme vores data i et objekt (en såkaldt dataframe
), så vi nemmere kan arbejde mere direkte med det (hvis vi f.eks. vil tilføje flere kolonner til datasættet eller udtage en delmængde af det). Vi kan gøre dette med en kodelinje på formen: pingviner <- palmerpenguins::penguins
. Det er altid en god idé at tjekke, om man har fået sit data indlæst korrekt. Et hurtigt tjek kan være at bruge funktionen head()
på sin dataframe
. Denne funktion vil vise de første linjer af datasættet, hvormed man visuelt kan inspicere, om alt ser ud som forventet (og man kan danne sig et fint overblik over, hvilke typer af målinger data indeholder).
pingviner
og tjek, om alt ser korrekt ud vha. funktionen head()
.
# Indtast de nødvendige to linjers kode for at gemme datasættet penguins i et objekt og se starten af datasættet:
Tip: Vi kan gemme datasættet ved at tildele det til et objekt ved hjælp af operatoren <-
.
pingviner <- palmerpenguins::penguins
head(pingviner)
Når vi har indlæst data korrekt er det altid godt at lave noget grafik for at få en forståelse af data. De grafik-kommandoer vi bruger i kurset stammer fra pakken ggformula
som automatisk indlæses når hovedpakken mosaic
indlæses, hvilket vi altid skal huske at gøre (ligesom vi sikrer os at data er gemt med det navn vi bruger resten af tiden):
library(mosaic)
pingviner <- palmerpenguins::penguins
Her er et eksempel på en grafik-kommando (de starter alle med gf_
)
gf_point(bill_length_mm ~ body_mass_g, data = pingviner)
## Warning: Removed 2 rows containing missing values (geom_point).
Dette viser en generel skabelon goal(y ~ x, data = DATA, ...)
vi kommer til at bruge rigtig meget:
gf_point
som giver et punkt-plot.y ~ x
, og kan læses som: “y forklaret af x”, “y modelleret af x”, “y vs. x”, etc: Her betyder bill_length_mm ~ body_mass_g
hvordan næblængden i millimeter afhænger af vægten i gram.data = pingviner
....
) såsom grupper, farver osv. hvilket vi lærer senere.Vi kan tilføje et yderligere element til formlen ved at bruge |
, hvilket læses som “for hver”, så hvis vi vil se sammenhængen mellem næblængde og vægt for hver ø der er indsamlet data fra:
gf_point(bill_length_mm ~ body_mass_g | island, data = pingviner)
## Warning: Removed 2 rows containing missing values (geom_point).
Endelig kan man tilføje farver (bemærk igen symbolet ~
som indikerer at der skal farves ud fra værdien af en variabel i datasættet):
gf_point(bill_length_mm ~ body_mass_g | island, data = pingviner, color = ~species)
## Warning: Removed 2 rows containing missing values (geom_point).
Vi kan naturligvis kun undersøge sammenhængen mellem variable hvis vi ved hvad de hedder. Vi kan finde alle variabelnavne i datasætte med kommandoen names()
:
names(pingviner)
## [1] "species" "island" "bill_length_mm"
## [4] "bill_depth_mm" "flipper_length_mm" "body_mass_g"
## [7] "sex" "year"
Prøv selv at plotte sammenhængen mellem to variable fra datasættet (du må også gerne splitte op i flere plots og farver):
# Modificer koden herunder for at plotte en anden sammenhæng efter eget valg
gf_point(bill_length_mm ~ body_mass_g, data = pingviner)
Tip: Du skal blot udskifte variablene bill_length_mm
og body_mass_g
med to andre. F.eks. flipper_length_mm
og bill_depth_mm
.
I dette plot ser vi på sammenhæng mellem næblængde og ø:
gf_point(bill_length_mm ~ island, data = pingviner)
## Warning: Removed 2 rows containing missing values (geom_point).
Bemærk at island
er en tekst-variabel, så i første omgang giver et punkt-plot ikke mening, men R har så bare valgt at placere dem ved værdierne 1, 2 og 3 på 1.-aksen, men med tallene på aksen erstattet af teksten. Når man ser plottet kunne man meget naturligt spørge sig selv, hvad gennemsnitslængden i grunden er for hver ø?
Den udregner vi efter samme princip som før goal(y ~ x, data = DATA, ...)
:
mean(bill_length_mm ~ island, data = pingviner)
## Biscoe Dream Torgersen
## NA 44.16774 NA
Bemærk at to gennemsnit er NA
hvilket betyder “Not available”, dvs. de mangler. Dette sker fordi der er nogle pingviner som vi ikke har registreret næblængden af (f.eks. pingvin nummer 4):
head(pingviner)
Vi kan fortælle R, at de manglende observationer bare skal slettes fra data når vi udregner gennemsnittet:
mean(bill_length_mm ~ island, data = pingviner, na.rm = TRUE)
## Biscoe Dream Torgersen
## 45.25749 44.16774 38.95098
Der findes mange andre numeriske opsummeringer af data end gennemsnittet, hvor kommandoerne har oplagte navne som min()
for minimum osv. Prøv selv at finde den maksimale næblængde for hver pingvin-art:
## Kopier kommandoen ovenfor og modificer den på passende vis.
Tip: Du skal bruge kommandoen max
med variablene bill_length_mm
og species
. Husk na.rm = TRUE
.
max(bill_length_mm ~ species, data = pingviner, na.rm = TRUE)
Hvis der kun er en enkelt variabel, der skal indgå i hovedplottet, kan vi ikke bruge syntaksen goal(y ~ x, data = DATA, ...)
, men må udelade y
. Så kan vi oftest tænke på det, som om selve kommandoen fortæller, hvad der er på 2.-aksen i stedet for variablen y
. F.eks. et søjle-diagram med antal pingviner af hver art:
gf_counts(~ species, data = pingviner)
Denne type plots kan også arbejdes videre på med opsplitning, farver osv. Lad os f.eks. se på, om de forskellige pingvinarter fordeler sig forskelligt på de tre øer, hvor data er indsamlet:
gf_percents(~ species | island, data = pingviner, fill = ~species, color = "black")
Prøv at kopiere ovenstående kode for at ændre den, så du kan besvare, om hver art udgør den sammen procentdel hvert af årene, som dataindsamlingen har løbet over:
# Er der samme procentvise fordeling mellem arterne i årene 2007, 2008, 2009?
Tip: Du skal blot udskifte variablen island
med year
.