Omgaan met lege waarden (NA's)

Lege of onbeschikbare waarden worden in R aangegeven met NA. In andere systemen worden dit ook wel eens "Missing Values" of NULL waarden genoemd. Deze waarden kunnen vervelend zijn omdat ze er voor zorgen dat je bepaalde berekeningen niet kunt uitvoeren. Ook mis je gewoon een stukje belangrijke data. Er zijn verschillende manieren om met deze NA waarden om te gaan.

  • De hele rijen of kolommen die een NA waarde bevat, verwijderen;
  • De NA's vervangen door 0;
  • De NA's vervangen door een berekende waarde.

In dit hoofdstuk wordt gedemonstreerd hoe je NA's in de hele data frame kunt tellen en hoe je deze kolommen of rijen kunt verwijderen. Maak je geen zorgen, de andere twee methoden worden uitgebreid in hoofdstuk 11 van dit boek besproken.

NA's in een data frame tellen

De CP dataframe heeft "helaas" geen NA's. Daarom voegen we zelf een kolom toe met waarden die NA's bevat voor de demonstratie. Op deze manier kunnen we handelingen met NA's in een data frame demonstreren.

# een vector aanmaken met waarden en NA's
Sushi <- c(5.45,5.75,5.60,NA,6.15,6.30,7.15,7.50,NA,8.10,7.65,NA,8,8.45)

# de vector onder de naam 'sushi' aan CP toevoegen
CP$Sushi <- Sushi

# controleren of de variabele 'sushi' daadwerkelijk aan CP is toegevoegd
names(CP)
##  [1] "Jaar"                          "Benzine.Euro95"               
##  [3] "Diesel"                        "LPG"                          
##  [5] "Frikandel"                     "Glas.bier"                    
##  [7] "Glas.rode.huiswijn"            "Kopje.zwarte.koffie"          
##  [9] "Pizza"                         "Aardappelen"                  
## [11] "Appelmoes"                     "Bananen"                      
## [13] "Bier"                          "Boterhamworst"                
## [15] "Brood"                         "Champignons"                  
## [17] "Cornflakes"                    "Diepvries.patates.frites"     
## [19] "Eieren"                        "Hagelslag"                    
## [21] "Hamlappen"                     "Kaas"                         
## [23] "Kipfilet"                      "Koffie"                       
## [25] "Komkommer"                     "Koolzuurhoudend.mineraalwater"
## [27] "Krentenbol"                    "Macaroni"                     
## [29] "Margarine"                     "Mayonaise"                    
## [31] "Melk"                          "Mineraalwater.zonder.koolzuur"
## [33] "Olijfolie"                     "Pasta"                        
## [35] "Plantaardige.olie"             "Riblappen"                    
## [37] "Rijst"                         "Roomboter"                    
## [39] "Rundergehakt"                  "Shampoo"                      
## [41] "Sinaasappelsap"                "Sperziebonen.in.blik"         
## [43] "Suiker"                        "Tandpasta"                    
## [45] "Thee"                          "Toiletpapier"                 
## [47] "Tomatenketchup"                "Tonijn.in.blik"               
## [49] "Vanillevla"                    "Zelfrijzend.bakmeel"          
## [51] "APK.keuring"                   "Autorijles"                   
## [53] "Bioscoopkaartje"               "Car.wash"                     
## [55] "Dameskapper"                   "Herenkapper"                  
## [57] "Krant"                         "Testament"                    
## [59] "Zwemles"                       "Sushi"

We hebben nu een data frame CP die NA's bevat. Met de is.na functie kunnen we de NA's in een data frame opzoeken. We kunnen functies combineren als we willen weten welke kolommen missing values bevatten. We combineren de names() functie (om de namen van de kolommen/producten te kunnen zien), de colSums functie (om het aantal NA's op te tellen) en de is.na() functie die aangeeft of de waarde een NA is of niet. Hiermee wordt er voor iedere kolom een optelsom gemaakt van de NA's. Als de uitkomst groter is dan 0, wordt de naam van de kolom aangegeven. Om het aantal NA's te tellen, gebruiken we de sum() functie.

# evalueren welke waarde een NA is - de tail() functie wordt hier alleen gebruikt om 
# de output te beperken
names(CP)[colSums(is.na(CP)) > 0]
## [1] "Sushi"
# de NA-waarden optellen
sum(is.na(CP))
## [1] 3

Sushi is dus de enige kolom in de dataframe die NA waarden bevat. De optelsom over de hele dataframe laat zien om hoeveel NA waarden dit gaat.

De rijen met NA's verwijderen

De hele rij of kolom met een NA verwijderen, is een vrij grove aanpak. Echter is dit in sommige gevallen wenselijk. Dit doe je aan de hand van de volgende commands. Om een versie van CP te behouden die wel gewoon alle rijen en kolommen bevat, overschrijven we deze niet, maar maken we een nieuw object aan voor de data frame waar we de kolommen en rijen met NA's hebben weggehaald.

# een object CP2 aanmaken die alle data van CP bevat zonder de NA's
CP2 <- na.omit(CP)

# ter controle tellen hoeveel NA's CP2 bevat
sum(is.na(CP2))
## [1] 0

Ter controle vergelijken we ook de dimensies tussen CP en CP2.

dim(CP)
## [1] 14 60
dim(CP2)
## [1] 11 60

We kunnen zien dat CP2 3 rijen minder heeft dan CP. Door onze na.omit() functie zijn er dus 3 rijen verwijderd.

results matching ""

    No results matching ""