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.
U ovom ćete vodiču naučiti
- mutirati()
- Isključi nedostajuće vrijednosti (NA)
- Imputirajte nedostajuće vrijednosti (NA) sa srednjom vrijednosti i medijanom
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.
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:
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 |