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 lege character waarde, een . of een spatie/lege ruimte. R kan deze niet omzetten naar de waarde 0 en geeft daarom de waarde NA 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:

  1. Zoek alle NAs op met de is.na functie;

  2. Als je een NA tegenkomt, vervang die met de volgende berekening;

  3. mean(CP$Macaroni, na.rm=TRUE), waarmee het gemiddelde wordt berekend zonder de NAs;

  4. 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.

results matching ""

    No results matching ""