Download as pdf or txt
Download as pdf or txt
You are on page 1of 17

1 Introductie R

1.1 Doel van deze les

In deze les introduceren we de R software. We zullen de aandacht vestigen


op:

• enkele essentiële functies,

• het laden van datasets,

• het werken met variabelen,

• het maken van frequentietabellen en samenvattende statistieken,

• het maken van simpele grafieken.

1.1.1 Waarom R?
Er zijn een heleboel programma’s beschikbaar voor het statistisch analyse-
ren van data zoals SAS, SPSS, S+, Stata, Statistica, . . . In deze cursus zullen
we het softwarepakket R gebruiken dat in de recente geschiedenis de “de
facto” standaard is geworden voor veel statistici (zowel academisch als in
de industrie). Enkele voordelen van R:

• Commerciële programma’s vereisen een (vaak dure) licentie. R is gratis


te gebruiken voor alle doeleinden (academisch, non-profit, commercieel).
Je kan R dus gemakkelijk thuis installeren en blijven gebruiken indien je
geen toegang meer hebt tot bv. Athena.

• R is beschikbaar op zowat alle denkbare platformen: Windows, OS X,


een hele waaier aan UNIX platformen, . . .

• De basis R functionaliteit kan makkelijk worden uitgebreid met zoge-


naamde “packages”. Deze packages bevatten nieuwe, vaak geavanceerde
statistische methoden. Gezien R de afgelopen jaren de “de facto” stan-
daard is geworden, is R vaak het eerste statistische pakket waar een
implementatie van deze methodes beschikbaar is en dit in een groot
aantal wetenschappelijke disciplines.
8 statistische dataverwerking oefeningen

1.2 Starten met R

R is terug te vinden op Athena. In de “Academic” subfolder kan je R terug-


vinden (“R 3_2_3” of een latere versie ). Hoewel R ook zo te gebruiken valt,
kan je gemakkelijker werken door de IDE “RStudio” te gebruiken. RStudio
gaat o.a. je code meer gestructureerd weergeven. Ook RStudio vind je in
de “Academic” subfolder van Athena. Helaas is werken met RStudio via
Athena niet echt stabiel, dus via Athena werk je beter met R.
R en RStudio zijn gratis softwarepakketten en je kan die dus ook op je
eigen PC/laptop installeren. Meer informatie over het installeren van R
op je eigen systeem kan je vinden op http://www.r-project.org. Voor
RStudio vind je de info op http://www.rstudio.com.

Figuur 1.1: De R (boven) en RStudio


(onder) interface met een editor venster
geopend.

1.2.1 Console vs editor


De R console is de plek waar je de resultaten ziet verschijnen. Je kan code
typen aan de prompt (>). Bij elke druk op de Return toets wordt de code
onmiddellijk uitgevoerd. Dit doe je voornamelijk voor het bekijken van
objecten en resultaten, en/of het maken van snelle berekeningen.
introductie r 9

Figuur 1.2: De Run en Source knoppen


in RStudio

De editor is de plek waar je code bundelt in een script (cfr. ook Matlab).
Een script heeft verschillende voordelen:

• Je analyse is gedocumenteerd en reproduceerbaar

• Je kan ingewikkelde bewerkingen in 1 keer uitvoeren

• Je kan je werk opslaan en er later naar terugkeren zonder helemaal


opnieuw te moeten beginnen.

Je start een nieuw script in R door in de interface het menu File > New
Script te kiezen. In RStudio kies je File > New File > R script. In beide
gevallen opent een nieuw editor venster waar je kan in werken. (zie fig 1.1).
Code uitvoeren kan in de R editor door de lijnen te selecteren die je wil
uitvoeren en dan Ctrl+R of F5 te drukken. Op Mac is dit Cmd+Return.
In RStudio kan je een script op twee manieren gebruiken:

• Je kan een stuk code selecteren, en op de knop “Run” klikken om enkel


die code uit te voeren.

• Om alle code in het script tegelijkertijd uit te voeren, klik je op “Source”.


Dit gaat de code uitvoeren, maar geen output laten zien. Om de output
te zien, klik je op het pijltje naast “Source”. Nu zie je een dropdown
menu, en daarin selecteer je “Source with echo” (zie fig 1.2).

1.3 Basisbewerkingen in R

1.3.1 Rekenen met R


R is eigenlijk een gigantische statistische rekenmachine. We illustreren hier
de basisbewerkingen in R. Typ de volgende lijnen in de console (na het >
teken):
3 + 7

De console toont je nu het volgende:


> 3 + 7
[1] 10

Het > teken stelt de prompt voor. 3 + 7 is de code die werd uitgevoerd, en
[1] 10 is het resultaat. Je kan ook bvb
10 statistische dataverwerking oefeningen

3 + 9

in de editor typen, en vervolgens de code uitvoeren. De output kan je dan


opnieuw terugvinden in de console:
> 3 + 9
[1] 12

In het vervolg van de tekst, geven we telkens aan wat er aan de con-
sole getypt wordt door de lijn te laten beginnen met de prompt >. Deze
moet je dus NIET overtypen om de code zelf te proberen! Lijnen die niet
voorafgegaan worden door deze prompt, zijn de output die je krijgt.
De vorige uitgevoerde commands blijven altijd beschikbaar in de con-
sole, dus je kan altijd controleren wat je eerder hebt uitgevoerd. Met de
pijltjes omhoog en omlaag kan je door de vorige commando’s browsen. In
RStudio kan je de geschiedenis ook zien in het tabblad “History”.
Enkele simpele mathematische functies:
5^2 # machtsverheffing
sin(pi/2) # pi is 3.141593 in R
sqrt(16) # vierkantswortel
log(20) # natuurlijk logaritme
log10(100) # logaritme met basis 10
log2(164) # logaritme met basis 2

Merk op dat de tekst achter het symbool # in het grijs wordt weerge-
geven. Alles achter het symbool # wordt door R genegeerd. Je kan dit
gebruiken om extra commentaar toe te voegen aan je scripts.

1.3.2 Werken met objecten


In R kan je een naam geven aan eender welke waarde. Door dit te doen,
creëer je een object. De waarde kan een enkel getal zijn, maar ook een reeks
getallen of vector, een matrix, een dataset, een model, . . . . Om een waarde
toe te kennen aan een object, gebruik je de operator <-1 . We kunnen bv. de 1
De operator = werkt ook, maar in R
waarde 10 toekennen aan een object x: gebruik je beter <-. De operator = ge-
bruik je om argumenten te specifiëren.
x <- 10

We kunnen nu gewoon de naam van het object naast de prompt typen om


te zien wat zijn waarde is:
> x
[1] 10

We kunnen het object nu ook verder gebruiken om berekeningen mee uit te


voeren:
> x + 10
[1] 20

Merk op dat toen we x + 10 typten we deze waarde niet toegekend hebben


aan een variabele. R maakt wel een object aan, maar doordat het geen
naam krijgt, wordt het niet opgeslagen. R toont het object onmiddellijk in
de console.
introductie r 11

Enkele belangrijke punten:

• Als je een nieuwe waarde toekent aan een bestaand object, wordt de
vorige waarde zonder waarschuwing overschreven.

• een naam van een object moet beginnen met een letter, een punt (.) of
een underscore (_)2 . 2
In tegenstelling tot in andere talen,
heeft een punt geen speciale betekenis
in R
• namen in R zijn altijd hoofdlettergevoelig. anObject en AnObject zijn
twee verschillende objecten.

• we raden aan om in je eigen code korte maar duidelijke namen te ge-


bruiken.

1.3.3 Werken met functies

sin, sqrt, log ... zijn voorbeelden van functies. Een functie wordt gevolgd
door ronde haakjes, en tussen de ronde haakjes specifieer je de argumenten
aan de hand van het = teken. Indien een functie meerdere argumenten
heeft, dienen deze gescheiden te worden met een komma:
log(x = 164, base = 2) # 1
log(164, 2) # 2
log2(164) # 3

De functie log heeft twee argumenten, genaamd x en base (zie #1). De


naam van het argument specifiëren is niet verplicht: #1 en #2 zijn identiek.
Als je de naam van een argument niet specifieert, worden de waarden
toegekend aan de argumenten in de volgorde vermeld in de help files (zie
verder).
Sommige argumenten zijn nodig, terwijl andere optioneel zijn. Indien je
een nodig argument niet met de functie meegeeft, zal er een foutboodschap
in de console verschijnen:
> log2()
Error in log2() : 0 arguments passed to ’log2’ which requires 1

Optionele argumenten hebben een standaardwaarde. Indien je deze niet


met de functie meegeeft, wordt deze standaardwaarde gebruikt. De functie
round rondt bv. af naar een bepaald aantal cijfers na de komma. Dit aantal
wordt bepaald door het argument digits. De standaardwaarde voor dit
argument is 0, dus als je digits geen waarde geeft, rondt de functie af naar
de dichtsbijzijnde integer:
> round(5.3489)
[1] 5
> round(5.3489, digits=2)
[1] 5.35

De standaardwaarde voor argumenten vind je in de help files (zie verder).


12 statistische dataverwerking oefeningen

1.3.4 De Global environment


Alle objecten worden opgeslagen in de “Global environment”. Dit is niks
anders dan een lijst met namen van objecten die R in het geheugen heeft
opgeslagen. Om te weten welke objecten zijn opgeslagen in je huidige
sessie, kan je de functie ls() gebruiken. Deze functie geeft een character
vector terug met daarin de namen van alle objecten in de global environ-
ment.
Om objecten te verwijderen uit het geheugen, gebruik je de functie rm().
Deze functie is speciaal in die zin dat ze een variabel aantal argumenten
heeft. Ook andere functies zoals c(), mean(), sum(), . . . hebben een variabel
aantal argumenten. Bij de functie rm() kan je alle te verwijderen objecten
opgeven als argument, gescheiden door een komma:
> rm(list = ls()) #maakt de global environment leeg
> ls()
character(0)
> x <- 20
> y <- x + 3
> z <- "een karakter waarde"
> ls()
[1] "x" "y" "z"
> rm(x,y)
> ls()

1.4 Werken met verschillende datatypes

Tot nog toe hebben we enkel met heel simpele objecten gewerkt. Objecten
kunnen qua structuur sterk verschillen. De structuur van een object wordt
bepaald door de klasse.
De belangrijkste klassen voor de practica zijn:

• vectoren: eendimensionaal, en alle waarden zijn van hetzelfde type.

• matrices: tweedimensionaal, en alle waarden zijn van hetzelfde type

• data frames: een tweedimensionale lijst van vectoren (variabelen) die


van verschillende types kunnen zijn.

1.4.1 Werken met vectoren


Aanmaken van vectoren
Een vector is een eendimensionale lijst van waarden, die allemaal van
hetzelfde type zijn. De belangrijkste types zijn:

• numeric: dit zijn getallen

• character: karakterwaarden moeten worden omgeven door aanhalingste-


kens

• logical: de waarde TRUE of FALSE (zonder aanhalingstekens!!!)


introductie r 13

Je kan een vector aanmaken met de functie c(). Deze functie heeft op-
nieuw een variabel aantal argumenten, gescheiden door een komma.
numVect <- c(1,2.3, -44.2, 1.45e-3)
charVect <- c("a", "ab", "some words")
logiVect <- c(TRUE, TRUE, FALSE, TRUE)

Je kan het type van een vector achterhalen met de functie mode():
> mode(numVect)
[1] "numeric"
> mode(logiVect)
[1] "logical"

Rekenen met vectoren


De meeste functies en operatoren in R werken “gevectorizeerd“. Dit wil
zeggen dat ze de bewerking uitvoeren op alle waarden in de vector (cfr.
Matlab). Om bvb alle waarden in een vector te verdubbelen, heb je slechts 1
lijn code nodig:
> x <- c(4,2,6)
> x * 2
[1] 8 4 12

Selecteren van waarden


Je kan waarden in een vector aanpassen of selecteren door het gebruik
van indices. Deze indices zijn zelf een vector van ofwel numerieke, ofwel
logische waarden. Deze worden geplaatst achter de naam van de vector
tussen vierkante haakjes.

• positieve integers geven de posities die geselecteerd moeten worden.

• negatieve integers geven de posities die verwijderd moeten worden.

• Als je logische waarden gebruikt, moet je een vector gebruiken die even
lang is als de vector. Enkel waarden op de posities waar TRUE staat in de
index, worden behouden.

Enkele voorbeelden:
> x <- c(5, 9, 2, 4, 8)
> x[c(2,4,1)]
[1] 9 4 5
> x[c(-5,-1)]
[1] 9 2 4
> x[ x > 4]
[1] 5 9 8

De laatste lijn werkt doordat de operatie x < 4 een (naamloze) logische


vector teruggeeft, even lang als x:
> x > 4
[1] TRUE TRUE FALSE FALSE TRUE

Dit object wordt dan gebruikt als index voor x.


Om een of meerdere waarden te vervangen in een vector, kan je ook
indices gebruikenin combinatie met de operator <-. De volgende code
vervangt alle getallen in x groter dan 4 door een 0:
14 statistische dataverwerking oefeningen

x[x > 4] <- 0

Werken met logische operatoren


De operator > is een logische operator (groter dan). Daarnaast heb je
nog == (gelijk aan), < (kleiner dan), <= (gelijk aan of kleiner dan) en
>= (groter dan of gelijk aan). Al deze operatoren werken op volledige
vectoren. Je kan hiermee een volledige vector met een waarde vergelijken,
of de waarden in twee vectoren twee-aan-twee met elkaar vergelijken.
> x <- c(5, 9, 2, 4, 8)
> y <- c(4, 9, 3, 4, 7)
> x < 3
[1] FALSE FALSE TRUE FALSE FALSE
> y > x
[1] FALSE FALSE TRUE FALSE FALSE

1.4.2 Werken met matrices


Aanmaken van matrices
Matrices zijn tweedimensionale objecten met waarden van hetzelfde
type. Je kan matrices in R op twee manieren aanmaken. Ofwel gebruik je
de functie matrix(), ofwel combineer je een aantal vectoren met de functies
rbind() of cbind(). De functie matrix() bespreken we hier niet verder.
De functie rbind() bindt vectoren als rijen aan mekaar, en logischerwijze
bindt cbind() vectoren als kolommen aan elkaar. Als we dezelfde vectoren
x en y gebruiken als hiervoor, kunnen we ze combineren in een matrix als
volgt:
> amatrix <- rbind(x,y)
> amatrix
[,1] [,2] [,3] [,4] [,5]
x 5 9 2 4 8
y 4 9 3 4 7

Nu krijg je een matrix met twee rijen en 5 kolommen. Merk op dat je vecto-
ren maar met mekaar kan combineren als ze allemaal even lang zijn.
De functie matrix() bespreken we hier verder niet.
Selecteren van waarden in een matrix
Ook bij matrices kan je indices gebruiken. Bij matrices heb je echter
twee dimensies, gescheiden door een komma. Voor de komma plaats je
de indices voor selectie van de rijen, na de komma deze voor selectie van
de kolommen. Zowel voor de rijen als de kolommen kan je numerieke of
logische indices gebruiken. Als je een van beide niet opgeeft, dan selecteer
je gewoon alle rijen/kolommen.
In dit geval moeten de logische indices even lang zijn als de dimensie.
Met andere woorden, als je logische indices gebruikt voor bvb de kolomme,
moet die vector evenveel waarden hebben als er kolommen zijn. Je kan
alle kolommen waarvoor de som groter is dan 10 selecteren uit de matrix
amatrix met de volgende code:
introductie r 15

> ind <- colSums(amatrix) > 10 #colSums berekent de som van de kolommen
> ind
[1] FALSE TRUE FALSE FALSE TRUE
> amatrix[, ind ]
[,1] [,2]
x 9 8
y 9 7

1.5 Hulp nodig?

In de vorige secties hebben we enkele basisconcepten van R geïntroduceerd


die een vlotte start mogelijk zouden moeten maken. Het is onmogelijk om
in één les alle belangrijke onderdelen van R te belichten. Op een gegeven
moment zul je dus zelf een weg moeten banen door de vele functies die R
rijk is. Alvorens hulp te vragen aan een medestudent of assistent is het aan
te raden zelf een oplossing te zoeken (op die manier zul je snel vertrouwd
raken met R!). Je kan hulp zoeken op verschillende manieren.
We raden ten zeerste aan om thuis (of aan het einde van de les) de file
“BasicR.R” (op Minerva) door te nemen. Deze bevat een aantal extra’s
die (nog) niet behandeld werden, maar die op een gegeven moment wel
gebruikt zullen worden in de oefeningensessies of theoriecursus gezien
ze ook onderdeel zijn van het “basisvocabularium” van R. Hoewel het
doel van deze cursus zeker niet is om een expert in R te worden, is een
grondige basiskennis wel vereist om het als hulpmiddel te gebruiken bij het
beoefenen van statistiek.
Een meer uitgebreide uitleg kun je terugvinden in “SimpleR” (John
Verzani) en “The R Guide” (W. J. Owen). Dit is geen verplicht materiaal,
maar een handige referentie wanneer je een iets uitgebreidere uitleg wenst
omtrent bepaalde functies.
Wanneer je snel iets te weten wil komen over een bepaald onderwerp of
een bepaalde functie kun je ook de in R ingebouwde hulpfuncties gebrui-
ken. Indien je weet welke functie je nodig hebt, maar niet exact weet wat
de argumenten zijn, kun je als volgt hulp opvragen:
help(log)

of, sneller:
?log

Dit opent een helppagina voor de functie log (in een extern browser-
scherm). Deze helpfiles zijn vaak erg uitgebreid. Daarom enkele tips om
ze te lezen:
• De voorbeelden staan altijd helemaal onderaan, en werken altijd. Je kan
ze kopiëren naar een script en dan uitvoeren om te zien hoe de functie
werkt.

• Onder de hoofding “Usage” zie je de argumenten in volgorde en met


hun eventuele standaardwaarden.
16 statistische dataverwerking oefeningen

• Onder de hoofding “Arguments” vind je meer uitleg bij elk argument.


Controleer zeker welk type object voor elk argument verwacht wordt.
Functies kunnen sterk verschillend reageren afhankelijk van het type
object dat je opgeeft via de argumenten.

Gerelateerde functies hebben vaak een gemeenschappelijke helppagina.


Wanneer je bijvoorbeeld de helppagina van de functie log opvraagt zul je
zien dat de helppagina niet enkel handelt over de log functie maar over de
volledige familie van logaritmische en exponentiële functies.
Als je doel niet is om een specifieke functie te gebruiken, maar je een
meer algemene zoekactie wil verrichten, kun je gebruik maken van een
dubbel vraagteken:
??log

Indien je een foutboodschap krijgt na het uitvoeren van een bepaald stuk
code en je niet meteen weet wat de foutboodschap betekent, is de snelste
oplossing vaak om de foutboodschap in een zoekmachine te copy-pasten.
Gewoonlijk zijn er een hoop mensen die dezelfde fout al eerder hebben
gemaakt, en kom je terecht op een forum, blog, . . . met vragen, antwoorden,
tips, . . . omtrent je probleem!

1.6 Werken met data

Tijd om met wat echte data te werken! Download het bestand kaas.csv via
Minerva. We moeten eerst een zogenaamde “working directory” instellen.
Dit is de map waar R zoekt naar mogelijke databestanden. Mijn bestanden
zijn opgeslagen in de map H:\Teaching\StatData\Les1 voor deze les.
Ik zal deze dus instellen als mijn “working directory” (let op de dubbele
backslash in de Windows omgeving!):
setwd("H:\\Teaching\\StatData\\Les1")

Alternatief kan je dit (afhankelijk van de gebruikte interface) ook doen


door op File en vervolgens Change dir... te klikken en te navigeren naar
de map waar je de dataset hebt opgeslagen.
We kunnnen nu de data inladen.
kaas <- read.csv("kaas.csv")

De bovenstaande lijn code leest de dataset in. Omdat het een .csv be-
stand is, gebruiken we de functie read.csv. Een meer algemene functie
is read.table. Het is ook mogelijk andere formaten in te lezen zoals Excel
bestanden of bestanden gegenereerd met een ander statistisch pakket. We
zullen in de oefeningenlessen doorgaans werken met .csv bestanden. De
inhoud van de dataset is nu opgeslagen in het object kaas.
We kunnen de inhoud van de dataset bekijken door gewoon de naam
ervan te typen. De volledige dataset wordt dan weergegeven in de console:
kaas
introductie r 17

Indien je alles correct hebt uitgevoerd zou er in de console een matrix moe-
ten verschijnen met 30 rijen en 5 kolommen (rijnummers en kolomnamen
niet meegerekend). Voor een kleine dataset kan het interessant zijn om de
volledige dataset te bekijken, maar de volledige dataset weergeven wan-
neer deze erg omvangrijk is, is veelal onoverzichtelijk (bv. duizenden rijen
en/of kolommen). Je kunt best eerst de dimensies van de dataset bekijken
vooraleer over te gaan tot het printen van de volledige dataset of een deel
ervan:
nrow(kaas) # aantal rijen
ncol(kaas) # aantal kolommen

In één lijn:
dim(kaas)

Om een impressie van de data te krijgen is het vaak voldoende om de


eerste paar rijen weer te geven. Hiervoor kunnen we de functie head ge-
bruiken:
head(kaas)

Dit resulteert in de volgende output:


Case taste Acetic H2S Lactic
1 1 12.3 4.543 3.135 0.86
2 2 20.9 5.159 5.043 1.53
3 3 39.0 5.366 5.438 1.57
4 4 47.9 5.759 7.496 1.81
5 5 5.6 4.663 3.807 0.99
6 6 25.9 5.697 7.601 1.09

We heben dus vijf vectoren in de dataset: case (een volgnummer), taste


(de smaakscore), Acetic (de azijnzuurconcentratie), H2S (de waterstofsul-
fideconcentratie) en Lactic (melkzuurconcentratie). Wanneer we één van
deze vectoren willen extraheren uit de dataset, kunnen we het dollarteken
$ gebruiken:
kaas$taste

Resulteert in een enkele vector met de smaakscores:


[1] 12.3 20.9 39.0 47.9 5.6 25.9 37.3 21.9 18.1 21.0 34.9 57.2 0.7
[14] 25.9 54.9 40.9 15.9 6.4 18.0 38.9 14.0 15.2 32.0 56.7 16.8 11.6
[27] 26.5 0.7 13.4 5.5

Zoals eerder gezien, kunnen we deze waarden gemakkelijk gebruiken


om verdere berekeningen mee uit te voeren. We kunnen ze bv. herschalen:
kaas$taste/10

Resulteert in:
[1] 1.23 2.09 3.90 4.79 0.56 2.59 3.73 2.19 1.81 2.10 3.49 5.72 0.07
[14] 2.59 5.49 4.09 1.59 0.64 1.80 3.89 1.40 1.52 3.20 5.67 1.68 1.16
[27] 2.65 0.07 1.34 0.55

We kunnen ook twee vectoren optellen, bv. de totale zuurconcentratie


(azijnzuur en melkzuur; output niet getoond):
18 statistische dataverwerking oefeningen

kaas$Acetic + kaas$Lactic

We kunnen ook een nieuwe variabele toevoegen aan de dataset:


kaas$TotaalZuur <- kaas$Acetic + kaas$Lactic

Dit voegt een extra variabele toe aan de kaas dataset. Als je de eerste
rijen van de dataset weergeeft, zul je zien dat er een kolom is bijgekomen:
head(kaas)

resulteert in
Case taste Acetic H2S Lactic TotaalZuur
1 1 12.3 4.543 3.135 0.86 5.403
2 2 20.9 5.159 5.043 1.53 6.689
3 3 39.0 5.366 5.438 1.57 6.936
4 4 47.9 5.759 7.496 1.81 7.569
5 5 5.6 4.663 3.807 0.99 5.653
6 6 25.9 5.697 7.601 1.09 6.787
introductie r 19

1.7 Oefeningen

1.7.1 Dataverwerking
1. Download de surveyAS2008.csv dataset van Minerva en laad de dataset
in R.

2. Maak een nieuwe variabele (vector) met de naam koffie.liter die


aangeeft wat de consumptie van koffie per dag is (in liter). De hudige
eenheid in de dataset is “aantal koppen”. Je mag ervan uitgaan dat een
kop 20 cl bevat.

3. Maak een nieuwe variable (vector) met de naam zetmeel die aangeeft
hoe vaak de respondent voedingswaren consumeert die zetmeel be-
vatten. (De voedingswaren rijst, aardappelen, pasta, brood en granen
bevatten zetmeel.)

4. Maak een nieuwe variabele met de naam wandelafstand die aangeeft


of de afstand van de woonplaats van de respondent tot de faculteit zich
op wandelafstand (minder dan 5km) of niet op wandelafstand (minstens
5km) bevindt. Hiervoor zul je de functie findInterval moeten gebrui-
ken. Herinner dat je de helppagina van deze functie kunt opvragen door
volgende code te typen:
?findInterval

Indien je meer hulp nodig hebt, kan je hieronder een voorbeeld van het
gebruik van de functie terugvinden.
x <- 2:18 # een vector met alle nummers van 2 tot en met 18
v <- 10 # een nummer resulteert in twee groepen:
# alles < 10 en alles 10:
# [ •,10) en [10,+•)
findInterval(x, v)

5. Maak een nieuwe variabele met de naam leeftijdsklasse die aangeeft


in welke leeftijdsklasse elke respondent zich bevindt. De klassen worden
alsvolgt gedefinieerd:

• Jonger dan 25.


• Tussen 25 en 29
• Tussen 30 en 34
• Ouder dan 34.

Je hebt in dit geval meerdere groepen nodig, en zult dus een vector
moeten meegeven aan de functie. Een voorbeeld:
x <- 2:18 # een vector met alle nummers van 2 tot en met 18
v <- c(5, 10) # twee nummers resulteert in drie groepen
# alles < 5;
# alles 5 en < 10;
20 statistische dataverwerking oefeningen

# alles 10;
# [ •,5), [5, 10) en [10,+•)
findInterval(x, v)

6. Maak een frequentietabel en histogram van de variabele leeftijdsklasse


en een histogram van leeftijd. Vergelijk beide grafieken. Je hebt hier-
voor de functies table en hist nodig. Is een histogram een goeie keuze?

7. Maak een frequentietabel van de variabele leeftijdsklasse voor man-


nen en vrouwen afzonderlijk.
Voor deze vraag moet je een subset van de vector leeftijdsklasse
aanmaken. We geven een voorbeeld voor een andere variabele: Een
fiets is één van de mogelijke transportmiddelen. Veronderstel dat je
de leeftijd van de subset van fietsers wil bekomen. De fietsers zijn de
volgende personen:
survey$transport=="fiets"

Dit resulteert in een vector met TRUE/FALSE waarden, waarbij TRUE


een fietser aangeeft:
[1] TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
[9] FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
[17] FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE
[25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[33] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
[41] FALSE TRUE TRUE FALSE FALSE TRUE FALSE FALSE
[49] FALSE FALSE

De eerste persoon is dus een fietser, de tweede niet, enz. We kunnen


deze vector gebruiken om een subset van de leeftijden te bekomen, door
het gebruik van vierkante haakjes. De leeftijd van de eerste persoon is
bv.:
survey$leeftijd[1]

[1] 24

Indien we nu de leeftijden willen van alle fietsers, gebruiken we de


vector met TRUE/FALSE waarden om de subset te bekomen:
survey$leeftijd[survey$transport=="fiets"]

8. Geef een lijst van alle gebrukte vervoersmiddelen in de dataset zonder


naar de dataset te kijken. Gebruik de functie levels.

9. Bereken het gemiddelde en de standaardafwijking voor de variabelen


afstand en reisduur. Gebruik de functies mean en sd.

10. Bereken het gemiddelde en de standaardafwijking voor de variabele


reisduur voor mannen en vrouwen afzonderlijk.
introductie r 21

11. Vergelijk de distributies van de variabele sport voor mannen en vrou-


wen afzonderlijk d.m.v. boxplots en samenvattende statistieken (media-
nen, kwartielen, . . . ). Gebruik de functies boxplot en summary.

12. Maak een spreidingsdiagram van de variabele afstand t.o.v. de varia-


bele reisduur. Gebruik de functie plot.

1.8 Extra: grafieken

1.8.1 Voorbeelden
Deze sectie bevat extra informatie over het maken van grafieken. Je hoeft
dit niet onmiddellijk te lezen indien de les er bijna opzit, maar het bevat
nuttige informatie voor wanneer je bv. figuren wilt aanmaken om te ge-
bruiken in een werkstuk.
Herbekijk de boxplots in oefening 12. De boxplots zijn een nuttige gra-
fische weergave van de data, maar enkel betekenisvol indien we weten wat
de grafiek weergeeft. We kunnen een titel toevoegen aan de plot:
boxplot(survey$sport[survey$geslacht=="v"], main="Vrouwen")

En een label voor de y-as:


boxplot(survey$sport[survey$geslacht=="v"], main="Vrouwen",
ylab="Tijd (uren per week)")

Soms voegt R automatisch (as)titels toe:


plot(reisduur ~ afstand, data = survey)

Maar je kan deze steeds wijzigen door argumenten toe te voegen:


plot(reisduur ~ afstand, data = survey,
main="Afstand vs. reisduur",
xlab="Afstand", ylab="Reisduur")

De meeste functies om grafieken aan te maken (boxplot, plot, . . . ) delen


een aantal argumenten (main, xlab, ylab,. . . ). Dit zorgt ervoor dat indien je
een bepaalde functie kent om grafieken te maken, je wellicht ook snel die
kennis kunt toepassen om een ander type grafiek te maken.
Merk trouwens op dat je in R argumenten ook onder mekaar kan zetten.
Zolang de argumentenlijst niet is afgesloten met een rond haakje, leest R
gewoon door en negeert het de returns.
We kunnen ook meerdere grafieken naast of onder elkaar plotten:
par(mfrow=c(1,2)) # 2 plots naast elkaar (1 rij, 2 kolommen)
boxplot(survey$sport[survey$geslacht=="v"], main="Vrouwen")
boxplot(survey$sport[survey$geslacht=="m"], main="Mannen")
par(mfrow=c(1,1)) # reset

In dit geval is het wellicht beter om de twee boxplots in één grafiek samen
te tonen:
boxplot(survey$sport ~ survey$geslacht,
main="Activiteit volgens geslacht",
ylab="Tijd (uren per week)")
22 statistische dataverwerking oefeningen

Let op de gelijkaardige syntax zoals die al werd gebruikt in de plot func-


tie.
Om een grafiek te exporteren (bv. voor een werkstuk), moet je een
“graphics device” openen en terug sluiten, bv.:
png(file="boxplot_geslacht.png")
boxplot(survey$sport ~ survey$geslacht,
main="Activiteit volgens geslacht",
ylab="Tijd (uren per week)")
dev.off()

Andere “output devices” zijn ook beschikbaar (bv. jpeg, tiff, pdf).
Nog twee nuttige voorbeelden van het produceren en opslaan van gra-
fieken:
# Plots op twee verschillende pagina’s
pdf(file="Afstand_plots_2p.pdf")
boxplot(survey$afstand ~ survey$geslacht,
main="Afstand volgens geslacht", ylab="Afstand")
plot(survey$afstand ~ survey$reisduur,
main="Afstand volgens reisduur",
xlab="Reisduur", ylab="Afstand")
dev.off()

# Plots gecombineerd op een pagina


pdf(file="Afstand_plots_1p.pdf")
par(mfrow=c(1,2))
boxplot(survey$afstand ~ survey$geslacht,
main="Afstand volgens geslacht", ylab="Afstand")
plot(afstand ~ reisduur, data = survey,
main="Afstand volgens reisduur",
xlab="Reisduur", ylab="Afstand")
par(mfrow=c(1,1))
dev.off()
introductie r 23

1.8.2 Oefeningen
1. Reproduceer onderstaande figuren. Gebruik hiervoor de in R beschik-
bare datasets Theoph en iris.

Pharmacokinetics of Theophylline
12

Subject 1
Subject 2
Subject 3
10
8
Concentration

6
4
2
0

0 5 10 15 20 25

Time

The iris data

setosa
5

versicolor
virginica
4
Sepal width

3
2
1

4 5 6 7 8

Sepal Length

You might also like