Functies en loops
Alleen numerieke waarden in een correlatie
Naast individueel de correlatie uitrekenen tussen twee variabelen, kunnen we ook een matrix maken die tussen alle variabelen de correlatie uitrekent. Dit doen we gewoon door de cor()
functie te gebruiken, maar in plaats van twee variabelen daar in de plaatsen, wordt de naam van de data frame
er in geplaatst. Voorwaarde voor een correlatiematrix is echter wel dat alle variabelen numeriek zijn. Dat checken we eerst even. Hier gebruiken we de str()
functie voor.
str(CP)
## 'data.frame': 14 obs. of 59 variables:
## $ Jaar : int 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 ...
## $ Benzine.Euro95 : num 1.16 1.15 1.14 1.16 1.25 1.35 1.41 1.46 1.54 1.35 ...
## $ Diesel : num 0.85 0.82 0.79 0.79 0.89 1.02 1.09 1.1 1.29 1.01 ...
## $ LPG : num 0.45 0.43 0.43 0.43 0.46 0.51 0.57 0.59 0.68 0.51 ...
## $ Frikandel : num 0.89 0.96 1.04 1.06 1.08 1.1 1.12 1.16 1.21 1.25 ...
## $ Glas.bier : num 1.28 1.41 1.54 1.6 1.62 1.67 1.71 1.79 1.86 1.94 ...
## $ Glas.rode.huiswijn : num 1.83 2.01 2.18 2.26 2.31 2.36 2.38 2.47 2.64 2.79 ...
## $ Kopje.zwarte.koffie : num 1.18 1.28 1.41 1.47 1.51 1.55 1.57 1.62 1.7 1.81 ...
## $ Pizza : num 6.25 6.42 6.85 6.97 7.02 7 7.16 7.46 7.99 8.19 ...
## $ Aardappelen : num 0.63 0.75 0.87 0.79 0.73 0.58 0.86 0.81 0.77 0.72 ...
## $ Appelmoes : num 0.41 0.45 0.53 0.58 0.53 0.49 0.47 0.61 0.75 0.81 ...
## $ Bananen : num 1.51 1.62 1.74 1.7 1.54 1.62 1.52 1.53 1.57 1.6 ...
## $ Bier : num 1.17 1.29 1.38 1.43 1.29 1.28 1.31 1.37 1.46 1.6 ...
## $ Boterhamworst : num 6.31 7.49 7.81 7.99 7.69 7.61 7.45 7.12 7.17 7.39 ...
## $ Brood : num 1.29 1.34 1.38 1.39 1.41 1.43 1.37 1.35 1.48 1.46 ...
## $ Champignons : num 0.89 0.91 0.98 0.93 0.9 0.87 0.88 0.91 0.93 0.92 ...
## $ Cornflakes : num 2.39 2.67 2.85 2.95 2.97 2.97 3.25 3.53 3.75 3.88 ...
## $ Diepvries.patates.frites : num 1.06 1.09 1.18 1.14 1.06 0.98 1.02 1.31 1.33 1.26 ...
## $ Eieren : num 1.4 1.4 1.4 1.9 1.6 1.4 1.4 1.4 1.5 1.5 ...
## $ Hagelslag : num 1.17 1.23 1.3 1.38 1.22 1.18 1.15 1.13 1.21 1.29 ...
## $ Hamlappen : num 7.63 8.81 8.12 8 7.75 7.55 7.93 7.73 7.84 8.29 ...
## $ Kaas : num 7.01 7.34 7.58 7.67 7.34 7.18 7.24 7.11 8.39 8.15 ...
## $ Kipfilet : num 7.65 8.65 8.59 8.34 7.67 7.48 7.32 7.27 7.44 7.55 ...
## $ Koffie : num 6.16 5.96 5.76 5.54 4.94 5.5 5.8 6 6.6 6.58 ...
## $ Komkommer : num 0.81 0.8 0.91 0.87 0.75 0.77 0.89 0.91 0.83 0.84 ...
## $ Koolzuurhoudend.mineraalwater: num 0.25 0.25 0.25 0.26 0.21 0.2 0.31 0.35 0.37 0.41 ...
## $ Krentenbol : num 0.25 0.26 0.27 0.29 0.29 0.29 0.3 0.31 0.32 0.33 ...
## $ Macaroni : Factor w/ 13 levels " 0.82"," 0.88",..: 4 7 8 6 2 1 2 3 5 9 ...
## $ Margarine : num 0.64 0.69 0.72 0.76 0.73 0.68 0.68 0.7 0.78 0.79 ...
## $ Mayonaise : num 0.77 0.82 0.85 0.9 0.87 0.84 0.8 0.89 1.09 1.12 ...
## $ Melk : num 0.51 0.57 0.61 0.62 0.6 0.6 0.6 0.58 0.7 0.71 ...
## $ Mineraalwater.zonder.koolzuur: num 0.29 0.36 0.36 0.31 0.29 0.28 0.27 0.27 0.29 0.28 ...
## $ Olijfolie : num 5.39 5.18 5.04 4.98 4.75 4.62 5.37 5.41 5.24 5.13 ...
## $ Pasta : num 1.49 1.65 1.66 1.54 1.2 1.12 1.2 1.3 1.51 1.84 ...
## $ Plantaardige.olie : num 1.03 1.06 1.19 1.15 1.05 0.88 0.87 0.85 1.22 1.42 ...
## $ Riblappen : num 8.65 9.27 9.4 9.01 8.59 8.6 9 9.02 9.19 9.29 ...
## $ Rijst : num 2.12 2.21 2.27 2.27 1.81 1.5 1.39 1.48 1.73 2.03 ...
## $ Roomboter : num 1.09 1.11 1.12 1.09 1.05 1.01 1.01 1.08 1.22 1.15 ...
## $ Rundergehakt : num 5.87 6.08 6.02 5.71 5.05 5.19 5.18 5.02 5.22 5.4 ...
## $ Shampoo : num 1.72 1.78 1.84 1.84 1.62 1.49 2.05 2.07 2.17 2.15 ...
## $ Sinaasappelsap : num 0.84 0.86 0.87 0.89 0.8 0.73 0.74 0.91 0.95 0.89 ...
## $ Sperziebonen.in.blik : Factor w/ 12 levels " 0.52"," 0.54",..: 3 6 6 5 5 4 1 2 7 8 ...
## $ Suiker : num 0.88 0.89 0.88 0.85 0.82 0.79 0.78 0.8 0.78 0.79 ...
## $ Tandpasta : num 2.39 2.71 2.81 2.74 2.46 2.34 2.31 2.31 2.34 2.51 ...
## $ Thee : num 1.02 1.1 1.15 1.12 0.97 0.87 0.85 0.84 0.9 0.91 ...
## $ Toiletpapier : num 2.9 3.06 3.18 3.29 3.05 2.94 3 3.04 3.16 3.15 ...
## $ Tomatenketchup : num 1.55 1.61 1.64 1.72 1.8 1.81 1.84 1.88 2.07 2.16 ...
## $ Tonijn.in.blik : num 1.09 1.15 1.25 1.27 1.21 1.21 1.23 1.1 1.2 1.33 ...
## $ Vanillevla : num 0.84 0.94 0.99 0.98 0.92 0.9 0.86 0.87 0.95 0.87 ...
## $ Zelfrijzend.bakmeel : num 0.99 1.02 1.12 1.08 1.07 1.01 1.07 1.1 1.14 1.07 ...
## $ APK.keuring : Factor w/ 13 levels " 35.03"," 38.53",..: 8 11 12 10 9 7 6 5 4 3 ...
## $ Autorijles : num 29.5 32.3 34.5 36.3 37.5 ...
## $ Bioscoopkaartje : num 6.72 6.99 8.1 7.35 7.56 7.8 7.99 8.14 8.28 8.5 ...
## $ Car.wash : num 7.15 7.63 8.17 8.26 8.49 8.65 8.83 8.87 9.25 9.53 ...
## $ Dameskapper : num 25.6 27 28.9 30.6 31.3 ...
## $ Herenkapper : num 13.4 14.4 15.3 16.1 16.9 ...
## $ Krant : num 1.03 1.06 1.11 1.17 1.22 1.25 1.22 1.25 1.26 1.39 ...
## $ Testament : Factor w/ 14 levels ".","217.46","226.21",..: 2 3 4 5 6 7 8 9 10 11 ...
## $ Zwemles : num 5.23 6.51 7.43 7.92 7.88 8.55 9.05 9.33 9.43 9.92 ...
Merk op dat de producten Macaroni
, Sperziebonen.in.blik
, APK.keuring
, Testament
de datatype factor
hebben. Echter kunnen we alleen een correlatie maken met variabelen die de datatype numeric
hebben, dit geldt dus ook voor een correlatiematrix. We krijgen namelijk de foutmelding 'x' must be numeric
als we dit niet doen:
Daarom willen we Macaroni
en Sperziebonen.in.blik
omzetten in een numerieke variabelen.
In de knoop met datatypes in R
De volgende serie aan commands laat zien hoe datatypes in elkaar zitten en hoe we deze kunnen manipuleren:
#De huidige datatype van Macaroni bekijken
class(Macaroni)
## [1] "factor"
Het datatype van Macaroni
is factor
. De eigenschappen kun je zien als we deze weergeven. Er wordt aangegeven dat er sprake is van 13 levels, dit zijn gewoon de verschillende prijzen die er hier voor Macaroni zijn op volgorde.
Macaroni
## [1] 1.09 1.21 1.22 1.13 0.88 0.82 0.88 0.95 1.10 1.34
## [11] 1.36 1.35 1.38 .
## 13 Levels: 0.82 0.88 0.95 1.09 1.10 1.13 1.21 ... .
De integer
-datatype: Zegt vaarwel tegen decimalen
Als we grofweg de as.numeric()
of is.numeric()
functie gebruiken, wordt Macaroni als integer opgeslagen. Het nadeel hiervan is dat het datatype "integer" staat voor volledige getallen en daarom de decimalen verwijderd.
as.numeric(Macaroni)
## [1] 4 7 8 6 2 1 2 3 5 9 11 10 12 13
class(as.numeric(Macaroni))
## [1] "numeric"
Als we echter naar de data kijken, zien we dat het niet eens meer lijkt op de prijzen van Macaroni
.
Omzetten naar een numeriek datatype door gebruik te maken van matrix
Een manier om de data numeriek te maken zonder data te verliezen, is door gebruik te maken van het matrix
formaat. We bekijken waarom dit zo is.
#De variabele "Macaroni" als matrix weergeven
as.matrix(Macaroni)
## [,1]
## [1,] " 1.09"
## [2,] " 1.21"
## [3,] " 1.22"
## [4,] " 1.13"
## [5,] " 0.88"
## [6,] " 0.82"
## [7,] " 0.88"
## [8,] " 0.95"
## [9,] " 1.10"
## [10,] " 1.34"
## [11,] " 1.36"
## [12,] " 1.35"
## [13,] " 1.38"
## [14,] "."
Let op de indicaties van de datapunten in de matrix. Datapunt [7,1]
geeft bijvoorbeeld de prijs 0.88
aan. Het zijn de juiste prijzen, maar echter in het verkeerde formaat. De aanhalingstekens "
verklappen namelijk dat het geen numerieke waarden zijn. Numerieke waarden worden namelijk aangegeven zonder aanhalingstekens. De volgende stap is daarom het omzetten van de waarden in de matrix in het numeric
formaat.
as.numeric(as.matrix(Macaroni))
## Warning: NAs introduced by coercion
## [1] 1.09 1.21 1.22 1.13 0.88 0.82 0.88 0.95 1.10 1.34 1.36 1.35 1.38 NA
NAs introduced by coercion. Dit is een waarschuwing die je vrij vaak gaat tegenkomen in R. Het zegt namelijk dat tijdens de conversie (coercion: dwingen van een waarde om in een bepaald formaat te veranderen) de waarde verloren is gegaan. In dit geval is dat gebeurd bij de laatste waarde in de matrix,
[14,1]
. Dit was namelijk een legecharacter
waarde, een.
of een spatie/lege ruimte. R kan deze niet omzetten naar de waarde0
en geeft daarom de waardeNA
aan dat datapunt, wat staat voor Not Available. Dit is voor ons niet erg want we weten dat het om een leeg datapunt gaat. Daarom zetten we deze later om in een andere waarde.
Nu willen we er zeker van zijn dat deze waarden in de data frame CP
terecht komen voor de variabele Macaroni
. We schrijven de huidige waarde van CP$Macaroni
over met onze zojuist aangemaakte waarden.
CP$Macaroni <- as.numeric(as.matrix(Macaroni))
## Warning: NAs introduced by coercion
class(CP$Macaroni)
## [1] "numeric"
CP$Macaroni
## [1] 1.09 1.21 1.22 1.13 0.88 0.82 0.88 0.95 1.10 1.34 1.36 1.35 1.38 NA
Gelukt! De waarden van de variabele Macaroni
hebben de datatype numeric
. Echter hebben we nu een nieuw probleem, de NA
-waarde.
Omgaan met NAs
(missing values) bij berekeningen in R
Een datacollectie of vector met een NA
-waarde, zorgt ervoor dat er niet op de standaard manier statistische- of rekenfuncties kunnen worden toegepast. Als we nu bijvoorbeeld het gemiddelde willen berekenen van ons zojuist aangepaste variabele Macaroni
(uit de CP
data frame), krijgen we het volgende resultaat:
mean(CP$Macaroni)
## [1] NA
min(CP$Macaroni)
## [1] NA
Een omweg hiervoor is gebruik maken van de summary
functie. Deze laat ook de minimumwaarde en het gemiddelde zien.
summary(CP$Macaroni)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.820 0.950 1.130 1.132 1.340 1.380 1
De mean
wordt in dit geval berekend zonder de NA
waarde: $$ \bar{x} = \frac{\sum x_i}{n-1}$$
Waarbij $X_i$ alle waarden zijn in Macaroni
zonder de NA
waarde:
$$ \ 1.131538 = \frac{1.09+1.21+1.22+1.13+0.88+0.82+0.95+1.10+1.34+1.36+1.35+1.38 }{14-1}$$
=
$$ \ 1.131538 = \frac{14.71 }{13}$$
We krijgen de waarde NA
in plaats van het gemiddelde. Gelukkig kunnen we de mean()
functie een extra argument geven waar in we aangeven hoe om te gaan met NAs
. Dit is het na.rm
argument, dat staat voor "NA remove" en aangeeft dat we voor het berekenen van de uitkomst de NAs
even weglaten (voor de calculatie even "removen"). Deze zetten we op TRUE
.
Als we dit toepassen en de berekeningen opnieuw proberen uit te rekenen, krijgen we de volgende resultaten:
mean(CP$Macaroni, na.rm = TRUE)
## [1] 1.131538
min(CP$Macaroni, na.rm = TRUE)
## [1] 0.82
We krijgen het gewenste resultaat en weten op welke manier deze berekend is.
Een lege waarde (NA
/missing value) vervangen door een berekende waarde (de ifelse()
functie)
De lege waarde negeren tijdens de berekening is een manier. Wat we ook kunnen doen, is de lege waarde vervangen door een berekende waarde. Een manier is door de lege waarde te vervangen door het gemiddelde van alle andere waarden.
We kunnen hier de ifelse()
functie voor gebruiken. De ifelse()
functie is als volgt opgebouwd:
"Als object gelijk is aan deze waarde, doe dan dit, doe anders dat"
In plaats voor "is gelijk aan" (==), kun je ook andere condities en operatoren zoals "kleiner dan" (<), "groter dan"(>) of "is niet" (!=). Een goed overzicht van de beschikbare operators in R kun je vinden in een artikel van [9] "Operators", (Kabacoff, 2014).
bijvoorbeeld:
waarde1 <- 5
waarde2 <- 4
antwoord <- ifelse(waarde1 < waarde2, "Lager","Hoger")
antwoord
## [1] "Hoger"
Het antwoord geeft Hoger
terug omdat waarde1
hoger is dan waarde2
.
Nu we de ifelse()
functie begrijpen, kunnen we deze gebruiken om de lege waarde in de Macaroni
te vullen.
CP$Macaroni <- ifelse(is.na(CP$Macaroni),mean(CP$Macaroni,na.rm=TRUE),CP$Macaroni)
CP$Macaroni
## [1] 1.090000 1.210000 1.220000 1.130000 0.880000 0.820000 0.880000
## [8] 0.950000 1.100000 1.340000 1.360000 1.350000 1.380000 1.131538
We hebben het gewenste resultaat, het gemiddelde is 1.131538
. In de ifelse()
functie hebben we de volgende dingen aangegeven:
Zoek alle
NAs
op met deis.na
functie;Als je een
NA
tegenkomt, vervang die met de volgende berekening;mean(CP$Macaroni, na.rm=TRUE)
, waarmee het gemiddelde wordt berekend zonder deNAs
;Waarden die geen
NAs
zijn, laat die hun eigen waarden behouden.
Het eindresultaat is dat we een CP$Macaroni
variabele hebben die de juiste datatype heeft en geen NAs
meer bevat.
class(CP$Macaroni)
## [1] "numeric"
CP$Macaroni
## [1] 1.090000 1.210000 1.220000 1.130000 0.880000 0.820000 0.880000
## [8] 0.950000 1.100000 1.340000 1.360000 1.350000 1.380000 1.131538
Tijd besparen door herhaaldelijk werk te vervangen met functies: function()
gebruiken in R
Om de vorige acties stuk voor stuk te doen kost veel tijd. Bijvoorbeeld als er veel meer kolommen zijn die we moeten veranderen. In deze situatie zijn het 5 variabelen waarbij we deze stappen moeten doen, dat valt nog wel te doen. Echter als het er bijvoorbeeld 50 zijn, is dat niet meer te doen en hebben we behoefte aan een mechanisme die dit herhaaldelijke werk voor ons doet. We zijn namelijk aan het programmeren dus dit moet niet raar klinken.
Voor dit probleem maken we gebruik van een van de sterkste wapens van programmeertalen, namelijk functies.
We gaan een functie schrijven die voor elke variabele in de CP
data frame dezelfde stappen uitvoert die we zojuist hebben gedaan. Dit doen we met de function()
functie.
Functies voorbeeld
Om eerst een beter beeld te krijgen van function()
, gebruiken we eerst een simpel voorbeeld.
We maken een functie die 3 argumenten heeft: getal1
, getal2
en getal3
. De waarden van getal1
en getal2
moeten worden opgeteld. Het resultaat daarvan moet worden vermenigvuldigd met de waarde van getal3
:
# een rekenfunctie maken
rekenFunctie <- function(getal1,getal2,getal3){
som <- getal1 + getal2
som2 <- som * getal3
som2
}
Het begint bij het definiëren van een naam, voor de <-
. Na de <-
geven we aan de het een functie moet bevatten door function
aan te geven. Tussen de ()
geven we aan welke waarden er steeds veranderen, in dit geval getal1
, getal2
en getal3
. Tussen de { }
geven we alle handelingen aan, in dit geval de calculatie.
Nu we de functie hebben gebouwd, kunnen we deze gebruiken door er simpelweg nieuwe waarden in te voeren.
rekenFunctie(3,6,2)
## [1] 18
# Andere waarden
rekenFunctie(123432,13256,78653)
## [1] 10750921264
Het grote voordeel is dat we het stuk van som
, som2
etc. niet steeds hoeven in te voeren.
Stappen laten herhalen met een loops in r, de for
functie
Voor onze functie moeten we ook een aantal zaken herhalen. Hier kunnen we een zogenaamde loop voor gebruiken. Het woord zegt het al, het voert een functie uit en eindigt daarna weer bij het begin (net als een looping bij een vliegtuig). Je geeft bij een loop het aantal keer aan dat die looping moet worden uitgevoerd, of wanneer het moet stoppen.
Het volgende korte voorbeeld laat zien hoe we een loop kunnen gebruiken in R. We schrijven een loop door een aantal personen te groeten.
namen <- c("Piet","Marco","Dirk","Arie","Rocco","Helga")
for (i in namen){
print(paste("Hallo ", i, ", alles goed?"))
}
## [1] "Hallo Piet , alles goed?"
## [1] "Hallo Marco , alles goed?"
## [1] "Hallo Dirk , alles goed?"
## [1] "Hallo Arie , alles goed?"
## [1] "Hallo Rocco , alles goed?"
## [1] "Hallo Helga , alles goed?"
Je kunt de loop ook duidelijker maken door gebruik te maken van meervoud en enkelvoud.
namen <- c("Piet","Marco","Dirk","Arie","Rocco","Helga")
for (naam in namen){
print(paste("Hallo ", naam, ", alles goed?"))
}
## [1] "Hallo Piet , alles goed?"
## [1] "Hallo Marco , alles goed?"
## [1] "Hallo Dirk , alles goed?"
## [1] "Hallo Arie , alles goed?"
## [1] "Hallo Rocco , alles goed?"
## [1] "Hallo Helga , alles goed?"
In deze loop is naam
slechts een "placeholder". In een for loop kunnen we neerzetten wat we willen als placeholder, bijvoorbeeld geit
namen <- c("Rosemarijn","Marco","Henk","Arie","Rocco","Helge")
for (geit in namen){
print(paste("Heey", geit))
}
## [1] "Heey Rosemarijn"
## [1] "Heey Marco"
## [1] "Heey Henk"
## [1] "Heey Arie"
## [1] "Heey Rocco"
## [1] "Heey Helge"
Loops en functies combineren
In sommige functies willen we een aantal stappen herhalen, daar gebruiken we ook loops voor. Op deze manier bouwen we deze loops in een functie. Met een simpel voorbeeld laten we zien hoe we een functie en een loop kunnen combineren. We maken een groet functie die iedereen groet met voor en achternaam en een welkomstboodschap geeft.
groetFunctie <- function(namen,achternamen){
for (i in 1:length(namen)){
print(paste("Hallo ",namen[i]," ",achternamen[i],
" welkom!"))
}
}
namen <- c("Jan","Pieter","Klaas")
achternamen <- c("Jansen","Post","Vaak")
groetFunctie(namen,achternamen)
## [1] "Hallo Jan Jansen welkom!"
## [1] "Hallo Pieter Post welkom!"
## [1] "Hallo Klaas Vaak welkom!"
Dit werkt ook als we andere collecties van namen gebruiken:
deelnemers <- c("James","Willie","Jaap","Winston")
achternaampjes <- c("Bond","Wortel","De Wit","Churchill")
groetFunctie(deelnemers,achternaampjes)
## [1] "Hallo James Bond welkom!"
## [1] "Hallo Willie Wortel welkom!"
## [1] "Hallo Jaap De Wit welkom!"
## [1] "Hallo Winston Churchill welkom!"
Meer informatie over loops kun je vinden in een artikel van Datacamp door Carlo Fanara [10] "A Tutorial on Loops in R - Usage and Alternatives" (Fanara, 2015).
Een functie bouwen om waarden numeriek te maken
We bouwen nu een functie waarin alle acties worden uitgevoerd die we hebben gedaan voor de CP$Macaroni
variabele. Het moet een functie zijn waarbij we alleen maar de naam van de variabele hoeven in te voeren. We noemen de functie numericValues
.
attach(CP)
numericValues <- function(variabele){
variabele2 <- as.numeric(as.matrix(variabele))
variabele3 <- ifelse(is.na(variabele2),mean(variabele2,na.rm=TRUE),
variabele2)
variabele3
}
class(Testament)
## [1] "factor"
Testament <- numericValues(Testament)
class(Testament)
## [1] "numeric"
Testament
## [1] 217.4600 226.2100 247.7400 260.5800 276.3900 287.8100 294.3000
## [8] 314.1500 335.0800 356.2300 370.4900 381.9300 400.5100 305.2985
We bekijken nu welke variabelen veranderd moeten worden in numeriek:
str(CP)
## 'data.frame': 14 obs. of 59 variables:
## $ Jaar : int 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 ...
## $ Benzine.Euro95 : num 1.16 1.15 1.14 1.16 1.25 1.35 1.41 1.46 1.54 1.35 ...
## $ Diesel : num 0.85 0.82 0.79 0.79 0.89 1.02 1.09 1.1 1.29 1.01 ...
## $ LPG : num 0.45 0.43 0.43 0.43 0.46 0.51 0.57 0.59 0.68 0.51 ...
## $ Frikandel : num 0.89 0.96 1.04 1.06 1.08 1.1 1.12 1.16 1.21 1.25 ...
## $ Glas.bier : num 1.28 1.41 1.54 1.6 1.62 1.67 1.71 1.79 1.86 1.94 ...
## $ Glas.rode.huiswijn : num 1.83 2.01 2.18 2.26 2.31 2.36 2.38 2.47 2.64 2.79 ...
## $ Kopje.zwarte.koffie : num 1.18 1.28 1.41 1.47 1.51 1.55 1.57 1.62 1.7 1.81 ...
## $ Pizza : num 6.25 6.42 6.85 6.97 7.02 7 7.16 7.46 7.99 8.19 ...
## $ Aardappelen : num 0.63 0.75 0.87 0.79 0.73 0.58 0.86 0.81 0.77 0.72 ...
## $ Appelmoes : num 0.41 0.45 0.53 0.58 0.53 0.49 0.47 0.61 0.75 0.81 ...
## $ Bananen : num 1.51 1.62 1.74 1.7 1.54 1.62 1.52 1.53 1.57 1.6 ...
## $ Bier : num 1.17 1.29 1.38 1.43 1.29 1.28 1.31 1.37 1.46 1.6 ...
## $ Boterhamworst : num 6.31 7.49 7.81 7.99 7.69 7.61 7.45 7.12 7.17 7.39 ...
## $ Brood : num 1.29 1.34 1.38 1.39 1.41 1.43 1.37 1.35 1.48 1.46 ...
## $ Champignons : num 0.89 0.91 0.98 0.93 0.9 0.87 0.88 0.91 0.93 0.92 ...
## $ Cornflakes : num 2.39 2.67 2.85 2.95 2.97 2.97 3.25 3.53 3.75 3.88 ...
## $ Diepvries.patates.frites : num 1.06 1.09 1.18 1.14 1.06 0.98 1.02 1.31 1.33 1.26 ...
## $ Eieren : num 1.4 1.4 1.4 1.9 1.6 1.4 1.4 1.4 1.5 1.5 ...
## $ Hagelslag : num 1.17 1.23 1.3 1.38 1.22 1.18 1.15 1.13 1.21 1.29 ...
## $ Hamlappen : num 7.63 8.81 8.12 8 7.75 7.55 7.93 7.73 7.84 8.29 ...
## $ Kaas : num 7.01 7.34 7.58 7.67 7.34 7.18 7.24 7.11 8.39 8.15 ...
## $ Kipfilet : num 7.65 8.65 8.59 8.34 7.67 7.48 7.32 7.27 7.44 7.55 ...
## $ Koffie : num 6.16 5.96 5.76 5.54 4.94 5.5 5.8 6 6.6 6.58 ...
## $ Komkommer : num 0.81 0.8 0.91 0.87 0.75 0.77 0.89 0.91 0.83 0.84 ...
## $ Koolzuurhoudend.mineraalwater: num 0.25 0.25 0.25 0.26 0.21 0.2 0.31 0.35 0.37 0.41 ...
## $ Krentenbol : num 0.25 0.26 0.27 0.29 0.29 0.29 0.3 0.31 0.32 0.33 ...
## $ Macaroni : num 1.09 1.21 1.22 1.13 0.88 0.82 0.88 0.95 1.1 1.34 ...
## $ Margarine : num 0.64 0.69 0.72 0.76 0.73 0.68 0.68 0.7 0.78 0.79 ...
## $ Mayonaise : num 0.77 0.82 0.85 0.9 0.87 0.84 0.8 0.89 1.09 1.12 ...
## $ Melk : num 0.51 0.57 0.61 0.62 0.6 0.6 0.6 0.58 0.7 0.71 ...
## $ Mineraalwater.zonder.koolzuur: num 0.29 0.36 0.36 0.31 0.29 0.28 0.27 0.27 0.29 0.28 ...
## $ Olijfolie : num 5.39 5.18 5.04 4.98 4.75 4.62 5.37 5.41 5.24 5.13 ...
## $ Pasta : num 1.49 1.65 1.66 1.54 1.2 1.12 1.2 1.3 1.51 1.84 ...
## $ Plantaardige.olie : num 1.03 1.06 1.19 1.15 1.05 0.88 0.87 0.85 1.22 1.42 ...
## $ Riblappen : num 8.65 9.27 9.4 9.01 8.59 8.6 9 9.02 9.19 9.29 ...
## $ Rijst : num 2.12 2.21 2.27 2.27 1.81 1.5 1.39 1.48 1.73 2.03 ...
## $ Roomboter : num 1.09 1.11 1.12 1.09 1.05 1.01 1.01 1.08 1.22 1.15 ...
## $ Rundergehakt : num 5.87 6.08 6.02 5.71 5.05 5.19 5.18 5.02 5.22 5.4 ...
## $ Shampoo : num 1.72 1.78 1.84 1.84 1.62 1.49 2.05 2.07 2.17 2.15 ...
## $ Sinaasappelsap : num 0.84 0.86 0.87 0.89 0.8 0.73 0.74 0.91 0.95 0.89 ...
## $ Sperziebonen.in.blik : Factor w/ 12 levels " 0.52"," 0.54",..: 3 6 6 5 5 4 1 2 7 8 ...
## $ Suiker : num 0.88 0.89 0.88 0.85 0.82 0.79 0.78 0.8 0.78 0.79 ...
## $ Tandpasta : num 2.39 2.71 2.81 2.74 2.46 2.34 2.31 2.31 2.34 2.51 ...
## $ Thee : num 1.02 1.1 1.15 1.12 0.97 0.87 0.85 0.84 0.9 0.91 ...
## $ Toiletpapier : num 2.9 3.06 3.18 3.29 3.05 2.94 3 3.04 3.16 3.15 ...
## $ Tomatenketchup : num 1.55 1.61 1.64 1.72 1.8 1.81 1.84 1.88 2.07 2.16 ...
## $ Tonijn.in.blik : num 1.09 1.15 1.25 1.27 1.21 1.21 1.23 1.1 1.2 1.33 ...
## $ Vanillevla : num 0.84 0.94 0.99 0.98 0.92 0.9 0.86 0.87 0.95 0.87 ...
## $ Zelfrijzend.bakmeel : num 0.99 1.02 1.12 1.08 1.07 1.01 1.07 1.1 1.14 1.07 ...
## $ APK.keuring : Factor w/ 13 levels " 35.03"," 38.53",..: 8 11 12 10 9 7 6 5 4 3 ...
## $ Autorijles : num 29.5 32.3 34.5 36.3 37.5 ...
## $ Bioscoopkaartje : num 6.72 6.99 8.1 7.35 7.56 7.8 7.99 8.14 8.28 8.5 ...
## $ Car.wash : num 7.15 7.63 8.17 8.26 8.49 8.65 8.83 8.87 9.25 9.53 ...
## $ Dameskapper : num 25.6 27 28.9 30.6 31.3 ...
## $ Herenkapper : num 13.4 14.4 15.3 16.1 16.9 ...
## $ Krant : num 1.03 1.06 1.11 1.17 1.22 1.25 1.22 1.25 1.26 1.39 ...
## $ Testament : Factor w/ 14 levels ".","217.46","226.21",..: 2 3 4 5 6 7 8 9 10 11 ...
## $ Zwemles : num 5.23 6.51 7.43 7.92 7.88 8.55 9.05 9.33 9.43 9.92 ...
De variabelen Sperziebonen.in.blik
,APK.keuring
en Testament
hebben de datatype factor
en gaan we met onze zelfgemaakte numericValues()
gebruiken.
class(CP$Sperziebonen.in.blik)
## [1] "factor"
CP$Sperziebonen.in.blik <- numericValues(CP$Sperziebonen.in.blik)
class(CP$Sperziebonen.in.blik)
## [1] "numeric"
CP$APK.keuring <- numericValues(CP$APK.keuring)
CP$Testament <- numericValues(CP$Testament)
str(CP)
## 'data.frame': 14 obs. of 59 variables:
## $ Jaar : int 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 ...
## $ Benzine.Euro95 : num 1.16 1.15 1.14 1.16 1.25 1.35 1.41 1.46 1.54 1.35 ...
## $ Diesel : num 0.85 0.82 0.79 0.79 0.89 1.02 1.09 1.1 1.29 1.01 ...
## $ LPG : num 0.45 0.43 0.43 0.43 0.46 0.51 0.57 0.59 0.68 0.51 ...
## $ Frikandel : num 0.89 0.96 1.04 1.06 1.08 1.1 1.12 1.16 1.21 1.25 ...
## $ Glas.bier : num 1.28 1.41 1.54 1.6 1.62 1.67 1.71 1.79 1.86 1.94 ...
## $ Glas.rode.huiswijn : num 1.83 2.01 2.18 2.26 2.31 2.36 2.38 2.47 2.64 2.79 ...
## $ Kopje.zwarte.koffie : num 1.18 1.28 1.41 1.47 1.51 1.55 1.57 1.62 1.7 1.81 ...
## $ Pizza : num 6.25 6.42 6.85 6.97 7.02 7 7.16 7.46 7.99 8.19 ...
## $ Aardappelen : num 0.63 0.75 0.87 0.79 0.73 0.58 0.86 0.81 0.77 0.72 ...
## $ Appelmoes : num 0.41 0.45 0.53 0.58 0.53 0.49 0.47 0.61 0.75 0.81 ...
## $ Bananen : num 1.51 1.62 1.74 1.7 1.54 1.62 1.52 1.53 1.57 1.6 ...
## $ Bier : num 1.17 1.29 1.38 1.43 1.29 1.28 1.31 1.37 1.46 1.6 ...
## $ Boterhamworst : num 6.31 7.49 7.81 7.99 7.69 7.61 7.45 7.12 7.17 7.39 ...
## $ Brood : num 1.29 1.34 1.38 1.39 1.41 1.43 1.37 1.35 1.48 1.46 ...
## $ Champignons : num 0.89 0.91 0.98 0.93 0.9 0.87 0.88 0.91 0.93 0.92 ...
## $ Cornflakes : num 2.39 2.67 2.85 2.95 2.97 2.97 3.25 3.53 3.75 3.88 ...
## $ Diepvries.patates.frites : num 1.06 1.09 1.18 1.14 1.06 0.98 1.02 1.31 1.33 1.26 ...
## $ Eieren : num 1.4 1.4 1.4 1.9 1.6 1.4 1.4 1.4 1.5 1.5 ...
## $ Hagelslag : num 1.17 1.23 1.3 1.38 1.22 1.18 1.15 1.13 1.21 1.29 ...
## $ Hamlappen : num 7.63 8.81 8.12 8 7.75 7.55 7.93 7.73 7.84 8.29 ...
## $ Kaas : num 7.01 7.34 7.58 7.67 7.34 7.18 7.24 7.11 8.39 8.15 ...
## $ Kipfilet : num 7.65 8.65 8.59 8.34 7.67 7.48 7.32 7.27 7.44 7.55 ...
## $ Koffie : num 6.16 5.96 5.76 5.54 4.94 5.5 5.8 6 6.6 6.58 ...
## $ Komkommer : num 0.81 0.8 0.91 0.87 0.75 0.77 0.89 0.91 0.83 0.84 ...
## $ Koolzuurhoudend.mineraalwater: num 0.25 0.25 0.25 0.26 0.21 0.2 0.31 0.35 0.37 0.41 ...
## $ Krentenbol : num 0.25 0.26 0.27 0.29 0.29 0.29 0.3 0.31 0.32 0.33 ...
## $ Macaroni : num 1.09 1.21 1.22 1.13 0.88 0.82 0.88 0.95 1.1 1.34 ...
## $ Margarine : num 0.64 0.69 0.72 0.76 0.73 0.68 0.68 0.7 0.78 0.79 ...
## $ Mayonaise : num 0.77 0.82 0.85 0.9 0.87 0.84 0.8 0.89 1.09 1.12 ...
## $ Melk : num 0.51 0.57 0.61 0.62 0.6 0.6 0.6 0.58 0.7 0.71 ...
## $ Mineraalwater.zonder.koolzuur: num 0.29 0.36 0.36 0.31 0.29 0.28 0.27 0.27 0.29 0.28 ...
## $ Olijfolie : num 5.39 5.18 5.04 4.98 4.75 4.62 5.37 5.41 5.24 5.13 ...
## $ Pasta : num 1.49 1.65 1.66 1.54 1.2 1.12 1.2 1.3 1.51 1.84 ...
## $ Plantaardige.olie : num 1.03 1.06 1.19 1.15 1.05 0.88 0.87 0.85 1.22 1.42 ...
## $ Riblappen : num 8.65 9.27 9.4 9.01 8.59 8.6 9 9.02 9.19 9.29 ...
## $ Rijst : num 2.12 2.21 2.27 2.27 1.81 1.5 1.39 1.48 1.73 2.03 ...
## $ Roomboter : num 1.09 1.11 1.12 1.09 1.05 1.01 1.01 1.08 1.22 1.15 ...
## $ Rundergehakt : num 5.87 6.08 6.02 5.71 5.05 5.19 5.18 5.02 5.22 5.4 ...
## $ Shampoo : num 1.72 1.78 1.84 1.84 1.62 1.49 2.05 2.07 2.17 2.15 ...
## $ Sinaasappelsap : num 0.84 0.86 0.87 0.89 0.8 0.73 0.74 0.91 0.95 0.89 ...
## $ Sperziebonen.in.blik : num 0.55 0.63 0.63 0.6 0.6 0.56 0.52 0.54 0.73 0.81 ...
## $ Suiker : num 0.88 0.89 0.88 0.85 0.82 0.79 0.78 0.8 0.78 0.79 ...
## $ Tandpasta : num 2.39 2.71 2.81 2.74 2.46 2.34 2.31 2.31 2.34 2.51 ...
## $ Thee : num 1.02 1.1 1.15 1.12 0.97 0.87 0.85 0.84 0.9 0.91 ...
## $ Toiletpapier : num 2.9 3.06 3.18 3.29 3.05 2.94 3 3.04 3.16 3.15 ...
## $ Tomatenketchup : num 1.55 1.61 1.64 1.72 1.8 1.81 1.84 1.88 2.07 2.16 ...
## $ Tonijn.in.blik : num 1.09 1.15 1.25 1.27 1.21 1.21 1.23 1.1 1.2 1.33 ...
## $ Vanillevla : num 0.84 0.94 0.99 0.98 0.92 0.9 0.86 0.87 0.95 0.87 ...
## $ Zelfrijzend.bakmeel : num 0.99 1.02 1.12 1.08 1.07 1.01 1.07 1.1 1.14 1.07 ...
## $ APK.keuring : num 59 80.3 80.3 78.2 60.9 ...
## $ Autorijles : num 29.5 32.3 34.5 36.3 37.5 ...
## $ Bioscoopkaartje : num 6.72 6.99 8.1 7.35 7.56 7.8 7.99 8.14 8.28 8.5 ...
## $ Car.wash : num 7.15 7.63 8.17 8.26 8.49 8.65 8.83 8.87 9.25 9.53 ...
## $ Dameskapper : num 25.6 27 28.9 30.6 31.3 ...
## $ Herenkapper : num 13.4 14.4 15.3 16.1 16.9 ...
## $ Krant : num 1.03 1.06 1.11 1.17 1.22 1.25 1.22 1.25 1.26 1.39 ...
## $ Testament : num 217 226 248 261 276 ...
## $ Zwemles : num 5.23 6.51 7.43 7.92 7.88 8.55 9.05 9.33 9.43 9.92 ...
Er kan natuurlijk ook gebruik gemaakt worden van een loop, zoals we dat behandeld hebben in het vorige gedeelte. Hier zijn heel veel manieren voor.