Kako zamijeniti nedostajuće vrijednosti (NA) u R: na.omit & na.rm

Vrijednosti koje nedostaju u znanosti o podacima nastaju kada promatranje nedostaje u stupcu podatkovnog okvira ili sadrži znakovnu vrijednost umjesto numeričke vrijednosti. Vrijednosti koje nedostaju moraju se izbaciti ili zamijeniti kako bi se iz podataka izvukao točan zaključak.

U ovom vodiču naučit ćemo kako se nositi s nedostajućim vrijednostima pomoću biblioteke dplyr. Biblioteka dplyr dio je ekosustava za realizaciju analize podataka.

Zamijenite nedostajuće vrijednosti u R

U ovom ćete vodiču naučiti

mutirati()

Četvrti glagol u dplyr biblioteka je korisno za stvaranje nove varijable ili promjenu vrijednosti postojeće varijable.

Nastavit ćemo u dva dijela. Naučit ćemo kako:

  • isključi nedostajuće vrijednosti iz podatkovnog okvira
  • imputirati nedostajuće vrijednosti sa srednjom i medijanom

Glagol mutate() vrlo je jednostavan za korištenje. Možemo stvoriti novu varijablu slijedeći ovu sintaksu:

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

Isključi nedostajuće vrijednosti (NA)

Metoda na.omit() iz biblioteke dplyr jednostavan je način za isključivanje opažanja koje nedostaje. Izbacivanje svih NA iz podataka je jednostavno, ali to ne znači da je to najelegantnije rješenje. Tijekom analize mudro je koristiti razne metode za rješavanje nedostajućih vrijednosti

Kako bismo riješili problem nedostajućih opažanja, koristit ćemo titanski skup podataka. U ovom skupu podataka imamo pristup informacijama o putnicima u zrakoplovu tijekom tragedije. Ovaj skup podataka ima mnogo NA o kojima treba voditi računa.

Prenijet ćemo csv datoteku s interneta i zatim provjeriti koji stupci imaju NA. Da bismo vratili stupce s podacima koji nedostaju, možemo koristiti sljedeći kod:

Učitajmo podatke i provjerimo podatke koji nedostaju.

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

Izlaz:

## [1] "age"  "fare"

Ovdje,

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

Daje naziv stupcima koji nemaju podatke.

U stupcima starost i cijena karte nedostaju vrijednosti.

Možemo ih ispustiti pomoću na.omit().

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

Izlaz:

## [1] 1045   13

Novi skup podataka sadrži 1045 redaka u usporedbi s 1309 s izvornim skupom podataka.

Isključi nedostajuće vrijednosti

Imputirajte podatke koji nedostaju pomoću srednje vrijednosti i medijana

Također bismo mogli imputirati (popuniti) vrijednosti koje nedostaju s medijanom ili sredinom. Dobra praksa je stvoriti dvije zasebne varijable za srednju vrijednost i medijan. Jednom stvorene vrijednosti koje nedostaju možemo zamijeniti novoformiranim varijablama.

Koristit ćemo metodu primjene za izračunavanje srednje vrijednosti stupca s NA. Pogledajmo primjer

Korak 1) Ranije u vodiču, pohranili smo naziv stupca s nedostajućim vrijednostima na popis pod nazivom list_na. Koristit ćemo se ovim popisom

Korak 2) Sada trebamo izračunati srednju vrijednost s argumentom na.rm = TRUE. Ovaj argument je obavezan jer stupci sadrže podatke koji nedostaju, a to govori R-u da ih zanemari.

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

Objašnjenje koda:

Prosljeđujemo 4 argumenta u metodi primjene.

  • df: df_titanic[,colnames(df_titanic) %in% list_na]. Ovaj kod će vratiti naziv stupca iz objekta list_na (tj. “age” i “fare”)
  • 2: Izračunajte funkciju na stupcima
  • srednja vrijednost: Izračunajte srednju vrijednost
  • na.rm = TRUE: Zanemarite vrijednosti koje nedostaju

Izlaz:

##      age     fare 
## 29.88113 33.29548

Uspješno smo stvorili srednju vrijednost stupaca koji sadrže opažanja koja nedostaju. Ove dvije vrijednosti će se koristiti za zamjenu opažanja koja nedostaju.

Korak 3) Zamijenite NA vrijednosti

Glagol mutate iz biblioteke dplyr koristan je u stvaranju nove varijable. Ne želimo nužno mijenjati izvorni stupac kako bismo mogli stvoriti novu varijablu bez NA. mutate je jednostavan za korištenje, samo odabiremo ime varijable i definiramo kako stvoriti tu varijablu. Ovdje je kompletan kod

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

Objašnjenje koda:

Stvaramo dvije varijable, replace_mean_age i replace_mean_fare na sljedeći način:

  • zamijeni srednju_dob = ifelse(is.na(dob), prosjek_nedostaje[1], dob)
  • zamjena_srednje_karte = ifelse(je.na(karta), prosjek_nedostaje[2],karta)

Ako stupac age ima nedostajuće vrijednosti, zamijenite ga prvim elementom prosječne_nedostajuće (srednja vrijednost starosti), inače zadržite izvorne vrijednosti. Ista logika za cijenu

sum(is.na(df_titanic_replace$age))

Izlaz:

## [1] 263

Izvršite zamjenu

sum(is.na(df_titanic_replace$replace_mean_age))

Izlaz:

## [1] 0

Izvorni stupac dob ima 263 vrijednosti koje nedostaju dok ih je novostvorena varijabla zamijenila srednjom vrijednosti varijable dob.

Korak 4) Opažanja koja nedostaju također možemo zamijeniti medijanom.

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)

Izlaz:

Imputirajte podatke koji nedostaju pomoću srednje vrijednosti i medijana

Korak 5) Veliki skup podataka mogao bi imati puno nedostajućih vrijednosti, a gornja metoda mogla bi biti glomazna. Možemo izvršiti sve gore navedene korake u jednom retku koda pomoću metode sapply(). Iako ne bismo znali vrijednosti srednje vrijednosti i medijana.

sapply ne stvara a podatkovni okvir, tako da možemo omotati funkciju sapply() unutar data.frame() da bismo stvorili objekt okvira podataka.

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

rezime

Imamo tri metode za rješavanje nedostajućih vrijednosti:

  • Isključite sva zapažanja koja nedostaju
  • Pripisati srednjoj vrijednosti
  • Pripisati medijanu

Sljedeća tablica sažima kako ukloniti sva opažanja koja nedostaju

Knjižnica Cilj Kodirati
baza Navedite zapažanja koja nedostaju
colnames(df)[apply(df, 2, anyNA)]
dplyr Uklonite sve vrijednosti koje nedostaju
na.omit(df)

Imputiranje sa srednjom ili medijanom može se izvršiti na dva načina

  • Korištenje primijeniti
  • Korištenje sapply
način Detaljnije Prednosti Nedostaci
Korak po korak uz prijavu Provjerite stupce u kojima nedostaju, izračunajte srednju vrijednost/medijan, pohranite vrijednost, zamijenite s mutate() Znate vrijednost srednje vrijednosti/medijana Više vremena izvršenja. Može biti spor s velikim skupom podataka
Brzi način s dodatkom Upotrijebite sapply() i data.frame() za automatsko pretraživanje i zamjenu vrijednosti koje nedostaju srednjom/medijanom Kratak kod i brzo Ne znam imputirane vrijednosti