Hoe ontbrekende waarden (NA) in R te vervangen: na.omit & na.rm

Ontbrekende waarden in de datawetenschap ontstaan ​​wanneer een waarneming ontbreekt in een kolom van een dataframe of een tekenwaarde bevat in plaats van een numerieke waarde. Ontbrekende waarden moeten worden geschrapt of vervangen om de juiste conclusie uit de gegevens te kunnen trekken.

In deze tutorial leren we hoe je met de dplyr-bibliotheek omgaat met ontbrekende waarden. De dplyr-bibliotheek maakt deel uit van een ecosysteem om data-analyses uit te voeren.

Vervang ontbrekende waarden in R

In deze tutorial leer je:

muteren()

Het vierde werkwoord in de dplyr-bibliotheek is handig om een ​​nieuwe variabele te maken of de waarden van een bestaande variabele te wijzigen.

We gaan in twee delen verder. We zullen leren hoe we:

  • sluit ontbrekende waarden uit een dataframe uit
  • impliceer ontbrekende waarden met het gemiddelde en de mediaan

Het werkwoord mutate() is heel makkelijk te gebruiken. We kunnen een nieuwe variabele maken volgens deze syntaxis:

mutate(df, name_variable_1 = condition, ...)
arguments:
-df: Data frame used to create a new variable
-name_variable_1: Name and the formula to create the new variable
-...: No limit constraint. Possibility to create more than one variable inside mutate()

Ontbrekende waarden uitsluiten (NA)

De na.omit()-methode uit de dplyr-bibliotheek is een eenvoudige manier om ontbrekende observaties uit te sluiten. Het verwijderen van alle NA uit de gegevens is eenvoudig, maar dat betekent niet dat het de meest elegante oplossing is. Tijdens de analyse is het verstandig om verschillende methoden te gebruiken om met ontbrekende waarden om te gaan

Om het probleem van ontbrekende waarnemingen aan te pakken, zullen we de Titanic-dataset gebruiken. In deze dataset hebben we toegang tot de informatie van de passagiers aan boord tijdens de tragedie. Deze dataset heeft veel NA waarvoor gezorgd moet worden.

We uploaden het csv-bestand van internet en controleren vervolgens welke kolommen NA hebben. Om de kolommen met ontbrekende gegevens te retourneren, kunnen we de volgende code gebruiken:

Laten we de gegevens uploaden en de ontbrekende gegevens verifiëren.

PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/test.csv"
df_titanic <- read.csv(PATH, sep = ",")
# Return the column names containing missing observations
list_na <- colnames(df_titanic)[ apply(df_titanic, 2, anyNA) ]
list_na

Output:

## [1] "age"  "fare"

Hier

colnames(df_titanic)[apply(df_titanic, 2, anyNA)]

Geeft de naam van kolommen die geen gegevens bevatten.

In de kolommen leeftijd en tarief ontbreken waarden.

We kunnen ze neerzetten met de na.omit().

library(dplyr)
# Exclude the missing observations
df_titanic_drop <-df_titanic %>%
na.omit()		
dim(df_titanic_drop)

Output:

## [1] 1045   13

De nieuwe dataset bevat 1045 rijen vergeleken met 1309 met de originele dataset.

Sluit ontbrekende waarden uit

Imputeer ontbrekende gegevens met het gemiddelde en de mediaan

We kunnen ook ontbrekende waarden toeschrijven (invullen) met de mediaan of het gemiddelde. Het is een goede gewoonte om twee afzonderlijke variabelen te maken voor het gemiddelde en de mediaan. Eenmaal gemaakt, kunnen we de ontbrekende waarden vervangen door de nieuw gevormde variabelen.

We zullen de methode Apply gebruiken om het gemiddelde van de kolom met NA te berekenen. Laten we een voorbeeld bekijken

Stap 1) Eerder in de zelfstudie hebben we de kolomnaam met de ontbrekende waarden opgeslagen in de lijst met de naam list_na. Wij zullen deze lijst gebruiken

Stap 2) Nu moeten we het gemiddelde berekenen met het argument na.rm = TRUE. Dit argument is verplicht omdat de kolommen ontbrekende gegevens bevatten, en dit vertelt R om deze te negeren.

# Create mean
average_missing <- apply(df_titanic[,colnames(df_titanic) %in% list_na],
      2,
      mean,
      na.rm =  TRUE)
average_missing

Code Verklaring:

We geven 4 argumenten door in de apply-methode.

  • df: df_titanic[,colnames(df_titanic) %in% lijst_na]. Deze code retourneert de kolomnaam van het list_na-object (dwz "leeftijd" en "tarief")
  • 2: Bereken de functie op de kolommen
  • gemiddelde: Bereken het gemiddelde
  • na.rm = TRUE: Negeer de ontbrekende waarden

Output:

##      age     fare 
## 29.88113 33.29548

We hebben met succes het gemiddelde van de kolommen met ontbrekende waarnemingen gemaakt. Deze twee waarden zullen worden gebruikt om de ontbrekende waarnemingen te vervangen.

Stap 3) Vervang de NA-waarden

Het werkwoord muteren uit de dplyr-bibliotheek is handig bij het maken van een nieuwe variabele. We willen niet noodzakelijkerwijs de oorspronkelijke kolom wijzigen, zodat we een nieuwe variabele kunnen maken zonder de NA. muteren is gemakkelijk te gebruiken, we kiezen gewoon een variabelenaam en definiëren hoe deze variabele moet worden gemaakt. Hier is de volledige code

# Create a new variable with the mean and median
df_titanic_replace <- df_titanic %>%
   mutate(replace_mean_age  = ifelse(is.na(age), average_missing[1], age),
   replace_mean_fare = ifelse(is.na(fare), average_missing[2], fare))

Code Verklaring:

We maken als volgt twee variabelen, Replace_mean_age en Replace_mean_fare:

  • Replace_mean_age = ifelse(is.na(leeftijd), gemiddelde_missing[1], leeftijd)
  • vervangen_gemiddelde_tarief = ifelse(is.na(tarief), gemiddelde_missing[2],tarief)

Als er waarden ontbreken in de kolom 'leeftijd', vervang deze dan door het eerste element van 'average_missing' (gemiddelde van de leeftijd); anders behoudt u de oorspronkelijke waarden. Dezelfde logica voor het tarief

sum(is.na(df_titanic_replace$age))

Output:

## [1] 263

Voer de vervanging uit

sum(is.na(df_titanic_replace$replace_mean_age))

Output:

## [1] 0

De oorspronkelijke kolomleeftijd bevat 263 ontbrekende waarden, terwijl de nieuw gemaakte variabele deze heeft vervangen door het gemiddelde van de variabele leeftijd.

Stap 4) We kunnen de ontbrekende waarnemingen ook vervangen door de mediaan.

median_missing <- apply(df_titanic[,colnames(df_titanic) %in% list_na],
      2,
      median,
      na.rm =  TRUE)
df_titanic_replace <- df_titanic %>%
            mutate(replace_median_age  = ifelse(is.na(age), median_missing[1], age), 
            replace_median_fare = ifelse(is.na(fare), median_missing[2], fare))
head(df_titanic_replace)

Output:

Imputeer ontbrekende gegevens met het gemiddelde en de mediaan

Stap 5) Een grote dataset kan veel ontbrekende waarden bevatten en de bovenstaande methode kan omslachtig zijn. We kunnen alle bovenstaande stappen hierboven in één regel code uitvoeren met behulp van de sapply() -methode. Hoewel we de dalen van gemiddelde en mediaan niet zouden kennen.

sapply creëert geen dataframe, zodat we de functie sapply() binnen data.frame() kunnen plaatsen om een ​​dataframe-object te maken.

# Quick code to replace missing values with the mean
df_titanic_impute_mean < -data.frame(
    sapply(
        df_titanic,
        function(x) ifelse(is.na(x),
            mean(x, na.rm = TRUE),
            x)))

Samenvatting

We hebben drie methoden om met ontbrekende waarden om te gaan:

  • Sluit alle ontbrekende waarnemingen uit
  • Imputeer met het gemiddelde
  • Imputeer met de mediaan

De volgende tabel vat samen hoe u alle ontbrekende observaties kunt verwijderen

Bibliotheek Objectief Code
baseren Maak een lijst van ontbrekende waarnemingen
colnames(df)[apply(df, 2, anyNA)]
dplyr Verwijder alle ontbrekende waarden
na.omit(df)

Imputatie met gemiddelde of mediaan kan op twee manieren gebeuren

  • Met behulp van toepassen
  • Sapply gebruiken
Methode Details Voordelen Nadelen
Stap voor stap met toepassen Controleer kolommen waarin ontbreken, bereken gemiddelde/mediaan, sla de waarde op, vervang door mute() Je kent de waarde van gemiddelden/mediaan Meer uitvoeringstijd. Kan traag zijn met een grote dataset
Snelle manier met saply Gebruik sapply() en data.frame() om ontbrekende waarden automatisch te zoeken en te vervangen door gemiddelde/mediaan Korte code en snel Ken de imputatiewaarden niet