Herinner je je nog wat vectoren, matrices en dataframes zijn? Nou, een vector is als een eindige reeks waarden, bijvoorbeeld een reeks getallen of een lijst van karakters/woorden. Het heeft slechts één dimensie en kan worden geschreven als een rij of een kolom. Een matrix en een dataframe zijn als een tabel met rijen en kolommen, waarin elke cel een waarde kan bevatten. Alle rijen hebben dezelfde lengte en alle kolommen hebben dezelfde lengte. Een matrix heeft twee dimensies: rij- en kolomrichtingen. Het belangrijkste verschil tussen matrices en dataframes is dat matrices alleen elementen van één type kunnen hebben, terwijl dataframes kolommen van verschillende datatypen kunnen hebben. Een array lijkt op een matrix, maar heeft meer dan twee dimensies. Een array is dus een multidimensionale tabel waarin gegevens zijn georganiseerd in meer dan twee dimensies (rijen, kolommen en meer). Het kan drie of meer dimensies hebben, maar waarden zijn beperkt tot één datatype. Arrays zijn handig bij het werken met digitale afbeeldingen, waarbij je de rode/groene/blauwe waarden van de pixels kunt specificeren als een 3-dimensionale array. Een andere toepassing van een driedimensionale array is wanneer je tweedimensionale gegevens hebt die in de loop van de tijd veranderen. De tijdvariabele is dan een derde dimensie in de dataset.
Uitleg
Je kunt een array maken met de functie array()
. Het veracht een vector en gebruikt deze vector om een object met de gespecificeerde dimensies te maken. De dimensies van een array kunnen getoond en ingesteld worden met de functie dim()
. The sessie aan de rechterkant illustreert dit.
Voorbeeldsessie
> A <- array(1:12, dim=c(2,3,2)); A
, , 1
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
, , 2
[,1] [,2] [,3]
[1,] 7 9 11
[2,] 8 10 12
> dim(A) <- c(3,2,2); A
, , 1
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
, , 2
[,1] [,2]
[1,] 7 10
[2,] 8 11
[3,] 9 12
> A <- array(1:2, c(2,3,2)); A
, , 1
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 2 2 2
, , 2
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 2 2 2
Beschouw drie kinderen, Chris, Stephan, and Robin, van wie je de lengte en het gewicht bijhoudt gedurende 4 opeenvolgende jaren (leeftijd 5 tot 8). Elk jaar registreer je een dataframe van de vorm
Naam |
Lengte |
Gewicht |
Chris |
|
|
Stephan |
|
|
Robin |
|
|
Uiteindelijk wil jedat de gegevens worden vastgelegd in een 3×2×43×2×4 array.
Eerst voer je de vier gegevensframes in:
> df5 <- data.frame(Naam = c("Chris", "Stephan", "Robin"),
+ Lengte = c(110, 111, 109),
+ Gewicht = c(15.5, 16, 15))
> df6 <- data.frame(Naam = c("Chris", "Stephan", "Robin"),
+ Lengte = c(117, 118, 117),
+ Gwiwicht = c(20, 21, 20.5))
> df7 <- data.frame(Naam = c("Chris", "Stephan", "Robin"),
+ Lengte = c(125, 124, 124),
+ Gewicht = c(24.5, 24, 24))
> df8 <- data.frame(Naam = c("Chris", "Stephan", "Robin"),
+ Lengte = c(132, 131, 132),
+ Gewicht = c(27, 26, 26.5))
Vervolgens maak je een dataframe dat deze vier dataframes combineert, maar zonder de eerste kolom van elk frame:
> df <- data.frame(df5[,-1], df6[,-1], df7[,-1], df8[,-1])
> df
Lengte Gewicht Lengte.1 Gewicht.1 Lengte.2 Gewicht.2 Lengte.3 Gewicht.3
1 110 15.5 117 20.0 125 24.5 132 27.0
2 111 16.0 118 21.0 124 24.0 131 26.0
3 109 15.0 117 20.5 124 24.0 132 26.5
Het trucje is dat je nu alle waarden in één reeks krijgt via de functie unlist()
en vervolgens deze getallen herschikt tot een driedimensionale array.
> array(unlist(df), dim=c(3,2,4))
, , 1
[,1] [,2]
[1,] 110 15.5
[2,] 111 16.0
[3,] 109 15.0
, , 2
[,1] [,2]
[1,] 117 20.0
[2,] 118 21.0
[3,] 117 20.5
, , 3
[,1] [,2]
[1,] 125 24.5
[2,] 124 24.0
[3,] 124 24.0
, , 4
[,1] [,2]
[1,] 132 27.0
[2,] 131 26.0
[3,] 132 26.5
Uitleg
Net als vectoren en matrices zijn dataframes indexeerbare en veranderlijke objecten. Dit betekent dat componenten van een array (ook wel elementen genoemd) kunnen worden benaderd via een positionele index, waarbij indexering begint bij 1, en dat je een array ook kunt wijzigen door een waarde toe te kennen aan een enkel onderdeel. Alles is gewoon een generalisatie van wat je hebt geleerd voor matrices naar meer dimensies.
Kijk goed naar de voorbeelden in de voorbeeldsessie aan de rechterkant.
Voorbeeldsessie
> A <- array(1:12, dim=c(2,3,2)); A
, , 1
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
, , 2
[,1] [,2] [,3]
[1,] 7 9 11
[2,] 8 10 12
> A[2,1,2] # selectie van een element
[1] 8
# verandering van een element
> A[2,3,2] <- 15; A
, , 1
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
, , 2
[,1] [,2] [,3]
[1,] 7 9 11
[2,] 8 10 15
> A[ , 3, ] # extractie van een bepaald deel
[,1] [,2]
[1,] 5 11
[2,] 6 15
# extractie van waarden langs één dimensie
> A[1, 2, ]
[1] 3 9