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.
In deze tutorial leer je:
- muteren()
- Ontbrekende waarden uitsluiten (NA)
- Imputeer ontbrekende waarden (NA) met het gemiddelde en de mediaan
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.
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:
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 |