Cum să înlocuiți valorile lipsă (NA) în R: na.omit & na.rm

Valorile lipsă în știința datelor apar atunci când o observație lipsește într-o coloană a unui cadru de date sau conține o valoare de caracter în loc de o valoare numerică. Valorile lipsă trebuie eliminate sau înlocuite pentru a trage concluzia corectă din date.

În acest tutorial, vom învăța cum să ne ocupăm de valorile lipsă cu biblioteca dplyr. Biblioteca dplyr face parte dintr-un ecosistem pentru a realiza o analiză a datelor.

Înlocuiți valorile lipsă în R

În acest tutorial, veți învăța

mutare()

Al patrulea verb din biblioteca dplyr este util pentru a crea variabile noi sau pentru a modifica valorile unei variabile existente.

Vom proceda în două părți. Vom învăța cum să:

  • exclude valorile lipsă dintr-un cadru de date
  • impută valorile lipsă cu media și mediana

Verbul mutate() este foarte ușor de folosit. Putem crea o nouă variabilă urmând această sintaxă:

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()

Excludeți valorile lipsă (NA)

Metoda na.omit() din biblioteca dplyr este o modalitate simplă de a exclude observația lipsă. Eliminarea tuturor NA din date este ușoară, dar nu înseamnă că este cea mai elegantă soluție. În timpul analizei, este înțelept să folosiți o varietate de metode pentru a trata valorile lipsă

Pentru a aborda problema observațiilor lipsă, vom folosi setul de date titan. În acest set de date, avem acces la informațiile pasagerilor aflați la bord în timpul tragediei. Acest set de date are multe NA care trebuie îngrijite.

Vom încărca fișierul csv de pe internet și apoi vom verifica ce coloane au NA. Pentru a returna coloanele cu date lipsă, putem folosi următorul cod:

Să încărcăm datele și să verificăm datele lipsă.

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

ieșire:

## [1] "age"  "fare"

Aici,

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

Oferă numele coloanelor care nu au date.

Coloanele Vârstă și tarif au valori lipsă.

Le putem arunca cu na.omit().

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

ieșire:

## [1] 1045   13

Noul set de date conține 1045 de rânduri, comparativ cu 1309 cu setul de date original.

Excludeți valorile lipsă

Impută datele lipsă cu media și mediana

De asemenea, am putea imputa (popula) valorile lipsă cu mediana sau cu media. O bună practică este să creați două variabile separate pentru medie și mediană. Odată create, putem înlocui valorile lipsă cu variabilele nou formate.

Vom folosi metoda de aplicare pentru a calcula media coloanei cu NA. Să vedem un exemplu

Pas 1) Mai devreme în tutorial, am stocat numele coloanelor cu valorile lipsă în lista numită list_na. Vom folosi această listă

Pas 2) Acum trebuie să calculăm media cu argumentul na.rm = TRUE. Acest argument este obligatoriu deoarece coloanele au date lipsă, iar acesta îi spune lui R să le ignore.

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

Explicația codului:

Transmitem 4 argumente în metoda apply.

  • df: df_titanic[,colnames(df_titanic) %in% list_na]. Acest cod va returna numele coloanelor din obiectul list_na (adică „vârsta” și „tarifa”)
  • 2: Calculați funcția pe coloane
  • medie: Calculați media
  • na.rm = TRUE: Ignorați valorile lipsă

ieșire:

##      age     fare 
## 29.88113 33.29548

Am creat cu succes media coloanelor care conțin observații lipsă. Aceste două valori vor fi folosite pentru a înlocui observațiile lipsă.

Pas 3) Înlocuiți valorile NA

Verbul mutare din biblioteca dplyr este util în crearea unei noi variabile. Nu vrem neapărat să schimbăm coloana originală, astfel încât să putem crea o nouă variabilă fără NA. mutate este ușor de utilizat, alegem doar un nume de variabilă și definim cum să creăm această variabilă. Aici este codul complet

# 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))

Explicația codului:

Creăm două variabile, replace_mean_age și replace_mean_fare după cum urmează:

  • înlocuiți_vârsta_medie = ifelse(este.na(vârsta), lipsă_medie[1], vârsta)
  • replace_mean_fare = ifelse(is.na(fare), average_missing[2],fare)

Dacă vârsta coloanei are valori lipsă, înlocuiți-l cu primul element de average_missing (media vârstei), altfel păstrați valorile originale. Aceeași logică pentru tarif

sum(is.na(df_titanic_replace$age))

ieșire:

## [1] 263

Efectuați înlocuirea

sum(is.na(df_titanic_replace$replace_mean_age))

ieșire:

## [1] 0

Vârsta inițială a coloanei are 263 de valori lipsă, în timp ce variabila nou creată le-a înlocuit cu media vârstei variabilei.

Pas 4) Putem înlocui și observațiile lipsă cu mediana.

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)

ieșire:

Impută datele lipsă cu media și mediana

Pas 5) Un set mare de date ar putea avea o mulțime de valori lipsă, iar metoda de mai sus ar putea fi greoaie. Putem executa toți pașii de mai sus într-o singură linie de cod folosind metoda saply(). Deși nu am cunoaște valea medie și mediană.

Sapply nu creează o cadru de date, astfel încât să putem include funcția sapply() în data.frame() pentru a crea un obiect cadru de date.

# 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)))

Rezumat

Avem trei metode pentru a trata valorile lipsă:

  • Excludeți toate observațiile lipsă
  • Imputați cu media
  • Imputați cu mediana

Următorul tabel rezumă cum să eliminați toate observațiile lipsă

Bibliotecă Obiectiv Cod
de bază Enumerați observațiile lipsă
colnames(df)[apply(df, 2, anyNA)]
dplyr Eliminați toate valorile lipsă
na.omit(df)

Imputarea cu medie sau mediană se poate face în două moduri

  • Folosind aplica
  • Folosind sapply
Metodă Detalii Avantaje Dezavantaje
Pas cu pas cu aplica Verificați coloanele cu lipsă, calculați media/mediana, stocați valoarea, înlocuiți cu mutate() Știți valoarea mijloacelor/medianei Mai mult timp de execuție. Poate fi lent cu un set de date mare
Mod rapid cu sapply Utilizați sapply() și data.frame() pentru a căuta automat și a înlocui valorile lipsă cu medie/mediană Cod scurt și rapid Nu cunosc valorile de imputare