I denne vejledning gennemgår vi lidt flere detaljer om R, og det er ikke strengt nødvendigt at gennemgå dette. Det er tænkt som ekstra materiale til dem der gerne vil forstå R lidt bedre og det er rigtig god træning i forskellige R-kommandoer og tankegange.
Det antages her at man har gennemgået den introducerende tutorial før man starter på nærværende tutorial.
Denne tutorial har fokus på R objekter. Alt vi arbejder med i R kaldes objekter, men der er forskellige typer og klasser af objekter. Disse programmeringstekniske begreber vil vi ikke uddybe yderliger. Det er dog godt at være opmærksom på mulighederne og begrænsningerne for de objekter, man gemmer sit data i.
Vi bruger datasættet penguins
fra pakken palmerpenguins
som eksempel. Vi gemmer datasættet med navnet pingviner
og ser starten af datasættet:
Vi kan oprette vektorer på flere måder, og en vektor kan bestå af enten decimaltal, af heltal eller sågar af tekst:
v <- c(5.4, 3, 7/5)
typeof(v)
## [1] "double"
x <- 3:11
typeof(x)
## [1] "integer"
fruits <- c("mango", "pineapple", "banana")
typeof(fruits)
## [1] "character"
I funktionen c()
står c’et for combine, men bemærk at et enkelt tal også betragtes som en vektor - altså en vektor med ét element.
Vi kan ikke både have heltal og decimaltal i samme vektor og ej heller både tekst og tal. Forsøger vi dette vil R automatisk konvertere hele vektoren til decimaltal hhv. tekst.
(v2 <- c(v, x))
## [1] 5.4 3.0 1.4 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0
typeof(v2)
## [1] "double"
(v3 <- c(v, fruits))
## [1] "5.4" "3" "1.4" "mango" "pineapple" "banana"
typeof(v3)
## [1] "character"
Bemærk: Når vi tildeler en værdi til et objekt, f.eks. x <- 3:11
, så printes værdien af objektet ikke umiddelbart på vores skærm, men vi kan få objektets værdi/indhold at se ved at sætte et parantes om linjen - altså ved f.eks. at skrive (x <- 3:11)
.
Når vi har oprettet en vektor, kan vi tilgå dens elementer på flere måder:
# Vi oprettede tidligere vektoren x med følgende elementer:
print(x)
## [1] 3 4 5 6 7 8 9 10 11
# Herunder er seks måder, hvormed man kan udvælge elementer fra x
# Vi udvælger element nummer 2
x[2]
## [1] 4
# Vi udvælger alle elementer pånær nummer 2
x[-2]
## [1] 3 5 6 7 8 9 10 11
# Vi udvælger element nummer 3, 4, 5, 6 og 7
x[3:7]
## [1] 5 6 7 8 9
# Vi udvælger element nummer 5 og 9
x[c(5,9)]
## [1] 7 11
# Vi udvælger alle elementer pånær element nummer 5 og 9
x[-c(5,9)]
## [1] 3 4 5 6 8 9 10
# Vi udvælger alle elementer i x, der er lig med 5
x[x == 5]
## [1] 5
I det sidste eksempel ovenfor brugte vi den logiske operator ==
til at udvælge alle elementer i x
, der er lig med 5. Der findes også andre logiske operatorer, bl.a. <
, <=
, >
, >=
. Brug en af disse til at udvælge elementerne 3, 4, 5, 6, 7, 8, 9 fra vektoren x
.
# Vi definerer x igen for en sikkerheds skyld:
x <- 3:11
# Udvælg de ovenfor angivne elementer fra x:
Tip: Opgaven løses nemmest med <
eller <=
.
I R opfattes TRUE
og FALSE
samt T
og F
som såkaldte logiske værdier (T
og F
er blot forkortelser for TRUE
og FALSE
) og er således af typen logical
. Opstiller man et udsagn i R, vil man som resultat få den logiske vektor, der udgør sandhedsværdien for udsagnet:
# Vi oprettede tidligere vektoren x med følgende elementer:
print(x)
## [1] 3 4 5 6 7 8 9 10 11
# Vi spørger hvilke elementer i x, der er lig 10
x == 10
## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
# Findes elementerne 1 hhv. 8 i x?
c(1, 8) %in% x
## [1] FALSE TRUE
# Hvilke elementer i x er større end eller lig med 7?
x >= 7
## [1] FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE
# Man kan negere et udsagn med et udråbstegn !
# En negering vender så at sige sandhedsværdierne om
# Hvilke elementer i x er IKKE større end eller lig med 7?
!(x >= 7)
## [1] TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE
# Vi kan sammensætte udsagn med | (læs: ELLER) samt med & (læs: OG)
# x mindre end 4 eller x større end eller lig 8?
x < 4 | x >= 8
## [1] TRUE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE
# x større end 5 og x mindre end 9?
x > 5 & x < 9
## [1] FALSE FALSE FALSE TRUE TRUE TRUE FALSE FALSE FALSE
Hvor en vektor kun kan indeholde enten decimaltal, heltal eller tekst, så er lister mere fleksible. Elementerne i en liste kan være forskellige typer af objekter:
# Vi opretter en matrix
M <- matrix(seq(from=2, by=3, length.out = 4), nrow = 2)
# Vi kommer nogle af vores tidligere oprettede objekter ind i to lister
(L1 <- list(v, fruits))
## [[1]]
## [1] 5.4 3.0 1.4
##
## [[2]]
## [1] "mango" "pineapple" "banana"
(L2 <- list(M, x))
## [[1]]
## [,1] [,2]
## [1,] 2 8
## [2,] 5 11
##
## [[2]]
## [1] 3 4 5 6 7 8 9 10 11
# Man kan sågar have lister i lister
(L <- list(L1, L2))
## [[1]]
## [[1]][[1]]
## [1] 5.4 3.0 1.4
##
## [[1]][[2]]
## [1] "mango" "pineapple" "banana"
##
##
## [[2]]
## [[2]][[1]]
## [,1] [,2]
## [1,] 2 8
## [2,] 5 11
##
## [[2]][[2]]
## [1] 3 4 5 6 7 8 9 10 11
Syntaksen for at tilgå elementer i en liste er lidt anderledes end for vektorer, da man skriver to sæt kantede paranteser:
# Vi udtager text-vektoren fruits fra listen L2
L1[[2]]
## [1] "mango" "pineapple" "banana"
# Vi udtager elementet "banana" fra tekst-vektoren i liste L2
L1[[2]][3]
## [1] "banana"
Udtag elementet 8 fra matricen M
i listen L2
i listen L
:
# Indtast den nødvendige kode for at udtage ovennævnte element:
Tip: Hold tungen lige i munden og tænk over, hvad du ville skrive, hvis du skulle udvælge én ting af gangen. Hvordan vil du udvælge L2
fra L
? Hvordan vil du udvælge M
fra L2
? Et element i en matrix udvælges med syntaksen M[i,j]
, hvor i
er rækkenummeret og j
er søjlenummeret.
L[[2]][[1]][1,2]
Når vi læser vores data ind i R, gemmer vi det i en dataframe
, hvilket er en særlig type liste, hvor alle elementer har samme længde, og hver især har et navn tilknyttet. Dette betyder, at vi kan stille elementerne i vores dataframe
op i søjler ved siden af hinanden, hvor hver søjle vil have lige mange rækker (samt have sit eget navn). Søjlerne i en dataframe
kalder vi for variable. Typisk vil vi gerne sætte vores dataframe
op, så hver række svarer til en observation, mens søjlerne er de egenskaber (variable), vi måler på (f.eks. højde, vægt, køn). Da hver søjle (variabel) har tilknyttet sit eget navn, så kan vi tilgå elementerne (variablene) på en mere intuitiv måde: Vi indlæste tidligere datasættet penguins
fra pakken palmerpenguins
, og da vi brugte funktionen head()
, så vi at det bestod af variablene species
, island
, bill_length_mm
, bill_depth_mm
, flipper_length_mm
, body_mass_g
, sex
, year
. Hvis vi har gemt dette datasæt som pingviner
, så kan vi f.eks. udvælge variablen island
med følgende syntaks:
pingviner$island
## [1] Torgersen Torgersen Torgersen Torgersen Torgersen Torgersen Torgersen
## [8] Torgersen Torgersen Torgersen Torgersen Torgersen Torgersen Torgersen
## [15] Torgersen Torgersen Torgersen Torgersen Torgersen Torgersen Biscoe
## [22] Biscoe Biscoe Biscoe Biscoe Biscoe Biscoe Biscoe
## [29] Biscoe Biscoe Dream Dream Dream Dream Dream
## Levels: Biscoe Dream Torgersen
Brug funktionen mean()
samt hvad du har lært indtil nu til at udregne den gennemsnitlige kropsmasse for pingvinarten Chinstrap
:
# Udregn den gennemsnitlige kropsmasse for pingvinarten Chinstrap:
Tip: Udvælg variablen species
og brug hvad du har lært om logiske vektorer til at spørge efter arten Chinstrap
. Dette kan nu bruges til at udvælge de relevante elementer fra variablen body_mass_g
.
mean(pingviner$body_mass_g[pingviner$species == 'Chinstrap'])
Dette kan på elegant vis gøres for alle arterne på én gang med koden:
dplyr::group_by(pingviner, species) %>%
dplyr::summarize(mean_mass = mean(body_mass_g, na.rm = TRUE))