[Deze webpagina is een aangepaste en enigszins gewijzigde HTML versie van een oorspronkelijke PDF file Introduktie in R, © dr. E.W. van Zwet]
R is een programmeer taal met een groot aantal voorgeprogrammeerde statistische functies. Het is de open source versie van S-plus. Wij gebruiken R dan ook omdat het gratis is. Wij maken geen gebruik van Excel of SPSS, omdat die programma's de statistische functies teveel achter knoppen verborgen houden. Wij willen juist zien hoe alles in z'n werk gaat. R kan wel eenvoudig data vanuit Excel importeren.
Hieronder staan een aantal voorbeelden van de belangrijkste R commando's. Het is de bedoeling dat je ze zelf intypt, of met copy-paste overbrengt, en kijkt wat er gebeurt. Wees nieuwsgierig en probeer zelf varianten uit. Wat zou er gebeuren als ik 1/0 uitreken... Hoe kan ik de sinus functie plotten...
Start R op.
Je krijgt een window met een prompt >.
Hier kun je commando's typen.
Om R af te sluiten, typ je
> q() Save workspace image? [y/n/c]:en typ n.
> 2+4 [1] 6 > 3*5 [1] 15 > 2^3 [1] 8 > sqrt(9) [1] 3 > sin(pi) # R kent pi [1] 1.224606e-16 # nou ja, eigenlijk 0! Soms is het antwoord van een berekening TRUE of FALSE > 2>4 # is 2 groter dan 4? [1] FALSE > 3==3 # let op de dubbele == [1] TRUE > 3!=3 # != staat voor ongelijkheid [1] FALSE > (3>2)&(3>4) # & staat voor het logische "EN" [1] FALSE > (3>2)|(3>4) # | staat voor het logische "OF" [1] TRUE
Bepaal uit je hoofd:
((3>2)|(3>4))|((3>2)&(3>4))
en controleer je antwoord met R.
Zijn de haakjes belangrijk?
Wat is:
((3>2)|(3>4)|(3>2))&(3>4)
Met behulp van een pijltje <- kunnen we een waarde toekennen aan een variabele. Het volgende commando maakt een variabele a met waarde 3.162.
> a <- sqrt(10)Kijk maar:
> a [1] 3.162278 > b <- a+5 # maakt een variabele b met waarde 8.162. > rm(a) #verwijdert de variabele a.Een zogeheten Boolese variabele (naar de engelsman George Boole) neemt de waarde
> c<-(3<4) > c [1] TRUEJe kunt ook met Boolese variabelen rekenen. Dan geldt: TRUE=1 en FALSE=0.
Vectoren zijn het belangrijkste onderdeel van R. Voor het maken van een vector maken we gebruik van de functie c [c = 'Combine Values into a Vector or List'] of van de functie seq [seq = 'Sequence Generation'], of van de functie rep [rep = 'Replicate Elements of Vectors and Lists']. Probeer de volgende voorbeelden uit:
> x <- 1,3,2,6,0 > x <- c(1,3,2,6,0) > x > x <- rep(3,10) > x > x <- seq(1, 20, by = 3) > x > x <- seq(10, 1, by = -2) > x > x <- 1:10 > x [1] 1 2 3 4 5 6 7 8 9 10We kunnen ook makkelijk getallen aan de vector x toevoegen:
x <- c(x,6,9,3)We kunnen ook rekenen met vectoren:
> y<-3*x - 12 > y [1] -9 -6 -3 0 3 6 9 12 15 18 > z<-(y<0) > z [1] TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSERekenen gaat meestal elementsgewijs, maar soms niet. Vergelijk
> x*y [1] -9 -12 -9 0 15 36 63 96 135 180 > x%*%y [,1] [1,] 495De notatie x%*%y geeft het inproduct van de vectoren x en y
Met behulp van de functie length kun je aan een vector vragen uit hoeveel elementen hij bestaat, bijv:
> length(y) [1] 10
Vectoren bestaan of uit getallen [en daar vallen de zg Boolese variabelen TRUE en FALSE ook onder], of uit letters [woorden]. Natuurlijk kun je alleen echt rekenen met vectoren die uit getallen bestaan. Dus dit werkt wel:
> c(TRUE, FALSE) * 3 [1] 3 0
maar dit niet:
> woord <- 'hallo' > tekst <- 'goede morgen' > 23 * tekst Error in 23 * tekst: non-numeric argument to binary operator > woord * tekst Error in woord * tekst : non-numeric argument to binary operator > '7' + '23' ???
Wat gebeurt er als je toch een vector probeert te maken waarin tekst en getallen door elkaar worden gebruikt?
> probeer <- c(23, 'hallo', 34, 567, 'goede morgen', 123465) > probeer [1] ???
Subscripting of Indexeren is het selecteren van elementen van een vector. We gebruiken rechte haken [ en ]
> y[3] [1] -3 > y[3:5] [1] -3 0 3 > y[c(1,3,5)] [1] -9 -3 3Negatieve selectie kan ook
> y[-3] # laat het derde element weg [1] -9 -6 0 3 6 9 12 15 18 > y[-c(1,3,5)] # laat elementen 1,3 en 5 weg [1] -6 0 6 9 12 15 18We kunnen ook selecteren met behulp van een Boolese vector. We selecteren alle elementen van y die groter zijn dan 0 door
> y[y>0] [1] 3 6 9 12 15 18
Samenvattend zijn er dus verschillende manieren om gegevens uit een vector te selecteren. Hier is een kort overzicht. Veronderstel dat x vector met getallen is, bijvoorbeeld:
> x <- 1:10 > length(x) # hoeveel elementen zitten er in x? > x[2] # het ide element, (i = 2) > x[-2] # alle elementen, behalve het ide, (i = 2) > x[1:5] # de eerste k elementen, (k = 5) > x[(length(x)-5):length(x)] # laatste k elementen, (k = 5) > x[c(1,3,5)] # bepaalde elementen (eerste, 3e en 5e) > x[x>3] # alle waarden groter dan een bepaalde,(de waarde is 3) > x[ x< -2 | x > 2] # groter dan of kleiner dan een bepaalde waarde > which(x == max(x)) # op welke plaats staat het grootste getal?
> A<-matrix(1:12, nrow = 4, ncol = 3) # de getallen 1 t/m 12 in 4 rijen
# en 3 kolommen.
> A
[,1] [,2] [,3]
[1,] 1 5 9
[2,] 2 6 10
[3,] 3 7 11
[4,] 4 8 12
We kunnen natuurlijk elementen van de matrix selecteren > A[1,2] [1] 5 > A[1:2,2:3] [,1] [,2] [1,] 5 9 [2,] 6 10 > A[2,] #selecteer de tweede rij [1] 2 6 10
Wat we hierboven over vectoren hebben gezegd, nl dat ze of uit getallen bestaan, of uit letters [woorden], geldt ook voor matrices. Je kunt dus niet in een matrix de ene rij of kolom uit getallen laten bestaan, en een volgende rij of kolom uit woorden, en je kunt getallen en tekst ook niet mengen in 1 rij of kolom.
Het is op zich wel mogelijk om tekst en getallen samen in de vorm van een matrix op te slaan, maar dat noemen we in R dan een data frame. Bijvoorbeeld een data matrix zoals we die ook buiten R zouden kunnen maken met Excel of in NotePad [of een andere platte tekst editor], met in de eerste rij de namen van de variabelen, en in de overige rijen de data waaruit die variabelen bestaan:
> x <- c("lengte", "hoogte", "breedte")
> y <- c(4, 5, 6)
> z <- c(7, 8, 9)
> d <- data.frame(x, y, z)
> d
x y z
1 lengte 4 7
2 hoogte 5 8
3 breedte 6 9
LET OP dat de vectoren x, y, en z dus kolomsgewijs aan elkaar worden geplakt tot een data frame. De elementen in de kolommen van een data frame moeten van het zelfde type zijn [of tekst, of getallen]. Dus in de eerste kolom staan in dit voorbeeld alleen maar woorden, en in de overige kolommen alleen maar getallen. Je kunt in een en dezelfde kolom niet getallen en tekst mengen, om dezelfde reden waarom dat in een vector ook mis gaat [de getallen worden dan nl automatisch in tekst omgezet]!
We hebben al een aantal functies gebruikt: q(), sqrt(), sin(), c(), rep(), seq(), matrix(). R heeft bijzonder veel ingebouwde functies. De uitleg van een functie is de vinden door
> help(sqrt)Hoe weet je nou of R een ingebouwde functie heeft voor (bijvoorbeeld) de cosinus? De beste methode is proberen te raden
> cosinus(pi) Error: couldn't find function "cosinus" > cos(pi) [1] -1 # Aha!
Je kunt de functies plot(), points() en lines() gebruiken om plaatjes te maken.
> x<-seq(0,2*pi,by=0.1) > plot(x,sin(x))of
> plot(x,sin(x),type='l')
Bekijk help(plot) voor alle mogelijkheden. De functie plot() maakt het bestaande plaatje eerst leeg. lines() en points() plotten over het bestaande plaatje heen. Je kunt ook een demo draaien om de vele plot mogelijkheden in R te zien:
> demo(graphics)
Plot de functie f (x) = x^2 op het interval [-5, 5]. Breng vervolgens de functie g(x) = |5x| aan in je grafiek.
Maak een plaatje van de letter F.
Een script is een programmaatje. Kies je favoriete editor [die van R zelf, of anders NotePad, maar zeker geen Word gebruiken!!], en schrijf een lijstje met commando's dat je wilt laten uitvoeren. Met copy-paste kun je deze commando's dan naar het R window copieren. Je kunt ook de functie source() gebruiken.
> source("myscript.r")
Hier is een voorbeeld van een scriptje dat de kwadraten van de getallen 1 t/m 10 uitrekent. We gebruiken een for-lus.
for (i in 1:10) {
cat(i,i^2,"\n")
}
De functie cat() schrijft naar het scherm. De toevoeging "\n" betekent "nieuwe regel". Laat de toevoeging weg, en kijk wat er gebeurt.
Hier is een script dat de if-constructie demonstreert. Let op alle accolades! Merk ook op hoe je door in te springen de structuur van het programma duidelijk kunt maken.
for (i in 1:10) {
cat(i,i^2,"\n")
if (i == 5) {
cat("halverwege!\n")
} # deze accolade sluit de if-constructie af
} # deze accolade sluit de for-lus af
Een for-lus is soms niet nodig, en kost dan nodeloos veel rekentijd.
Bepaal de kwadraten van de getallen 1 t/m 10 met behulp van een enkel commando.
In de Fibonacci rij is ieder getal gelijk aan de som van de twee voorafgaande getallen: 1, 1, 2, 3, 5, 8, 13, 21, ... Gebruik R om de eerste 20 Fibonacci getallen te bepalen.
Zij x(1) = 1, x(2) = 1, x(3) = 2, ... de Fibonacci getallen. Maak een plot van de getallen y(1) = x(2)/x(1), y(2) = x(3)/x(2), ..., y(19) = x(20)/x(19). De rij y(i) convergeert naar de zogeheten Gouden verhouding.
Het commando x<-sample(1:10,10000,replace=T) produceert een rij van tienduizend toevallig gekozen getallen tussen 1 en 10. Voer het commando uit, en tel hoeveel vijven er in de rij voorkomen.
Stel, x is een vector. Wat is het verschil tussen rank(x), sort(x) en order(x)?
Probeer ze allemaal uit!