Kuidas asendada R-is puuduvad väärtused (NA): na.omit & na.rm

Andmeteaduses puuduvad väärtused, kui vaatlus puudub andmeraami veerus või sisaldab numbrilise väärtuse asemel märgi väärtust. Andmete põhjal õige järelduse tegemiseks tuleb puuduvad väärtused välja jätta või need asendada.

Selles õpetuses õpime, kuidas dplyr teegiga puuduvaid väärtusi käsitleda. dplyr raamatukogu on osa ökosüsteemist andmete analüüsi teostamiseks.

Asenda R-s puuduvad väärtused

Selles õpetuses saate teada

mute ()

Neljas tegusõna teoses dplyr raamatukogu on abiks uue muutuja loomisel või olemasoleva muutuja väärtuste muutmisel.

Jätkame kahes osas. Õpime, kuidas:

  • välistada andmeraamist puuduvad väärtused
  • arvutada puuduvad väärtused keskmise ja mediaaniga

Tegusõna mute() on väga lihtne kasutada. Saame luua uue muutuja, järgides seda süntaksit:

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

Välista puuduvad väärtused (NA)

Meetod na.omit() dplyr teegist on lihtne viis puuduvate vaatluste välistamiseks. Kogu NA eemaldamine andmetest on lihtne, kuid see ei tähenda, et see oleks kõige elegantsem lahendus. Analüüsi ajal on mõistlik kasutada puuduvate väärtuste käsitlemiseks erinevaid meetodeid

Puuduvate vaatluste probleemi lahendamiseks kasutame Titanicu andmekogumit. Selles andmekogumis on meil juurdepääs tragöödia ajal pardal viibinud reisijate teabele. Sellel andmekogumil on palju NA-sid, mille eest tuleb hoolt kanda.

Laadime Internetist üles csv-faili ja seejärel kontrollime, millistel veergudel on NA. Puuduvate andmetega veergude tagastamiseks saame kasutada järgmist koodi:

Laadime andmed üles ja kontrollime puuduvad andmed.

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

Väljund:

## [1] "age"  "fare"

Siin

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

Annab veergude nimed, millel pole andmeid.

Veergudel vanus ja piletihind puuduvad väärtused.

Saame need tühistada käsuga na.omit().

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

Väljund:

## [1] 1045   13

Uus andmekogum sisaldab 1045 rida võrreldes 1309 reaga algse andmekogumiga.

Välista puuduvad väärtused

Arvuta puuduvad andmed keskmise ja mediaaniga

Samuti võime puuduvaid väärtusi omistada (asustada) mediaani või keskmisega. Hea tava on luua kaks eraldi muutujat keskmise ja mediaani jaoks. Kui see on loodud, saame puuduvad väärtused asendada äsja moodustatud muutujatega.

Kasutame NA-ga veeru keskmise arvutamiseks rakendusmeetodit. Vaatame näidet

Step 1) Varasemas õpetuses salvestasime veergude nimed koos puuduvate väärtustega loendisse list_na. Kasutame seda nimekirja

Step 2) Nüüd peame arvutama keskmise argumendiga na.rm = TRUE. See argument on kohustuslik, kuna veergudel puuduvad andmed ja see käsib R neid ignoreerida.

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

Koodi selgitus:

Rakendusmeetodis edastame 4 argumenti.

  • df: df_titanic[,colnames(df_titanic) %in% list_na]. See kood tagastab veergude nimed objektist list_na (st "vanus" ja "tariif")
  • 2: arvutage veergude funktsioon
  • keskmine: arvutage keskmine
  • na.rm = TRUE: Ignoreeri puuduvaid väärtusi

Väljund:

##      age     fare 
## 29.88113 33.29548

Oleme edukalt loonud puuduvaid vaatlusi sisaldavate veergude keskmise. Neid kahte väärtust kasutatakse puuduvate vaatluste asendamiseks.

Step 3) Asendage NA väärtused

Tegu dplyr teegist muteerima on kasulik uue muutuja loomisel. Me ei soovi tingimata algset veergu muuta, et saaksime luua uue muutuja ilma NA-ta. Mute on lihtne kasutada, me lihtsalt valime muutuja nime ja määratleme, kuidas seda muutujat luua. Siin on täielik kood

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

Koodi selgitus:

Loome kaks muutujat, asendada_keskmine_vanus ja asendada_keskmine_tariif järgmiselt:

  • asenda_keskmine_vanus = ifelse(on.na(vanus), keskmine_puuduvad[1], vanus)
  • asenda_keskmine_pilet = ifelse(on.na(pilet), keskmine_puudulik[2],pilet)

Kui veerus vanus puuduvad väärtused, asendage keskmise_puuduva (vanuse keskmine) elemendiga, vastasel juhul säilitage algsed väärtused. Sama loogika piletihinna osas

sum(is.na(df_titanic_replace$age))

Väljund:

## [1] 263

Tehke asendus

sum(is.na(df_titanic_replace$replace_mean_age))

Väljund:

## [1] 0

Algses veerus vanuses on 263 puuduvat väärtust, samas kui vastloodud muutuja on asendanud need muutuja vanuse keskmisega.

Step 4) Puuduvad vaatlused saame asendada ka mediaaniga.

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)

Väljund:

Arvuta puuduvad andmed keskmise ja mediaaniga

Step 5) Suurel andmekogumil võib olla palju puuduvaid väärtusi ja ülaltoodud meetod võib olla tülikas. Saame kõik ülaltoodud sammud täita ühes koodireas, kasutades meetodit sapply (). Kuigi me ei teaks keskmise ja mediaani väärtusi.

sapply ei loo a andmeraam, et saaksime andmeraami objekti loomiseks mähkida funktsiooni sapply() sisse data.frame().

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

kokkuvõte

Meil on puuduvate väärtuste käsitlemiseks kolm meetodit:

  • Välista kõik puuduvad tähelepanekud
  • Arvuta keskmisega
  • Arvestus mediaaniga

Järgmine tabel võtab kokku, kuidas eemaldada kõik puuduvad tähelepanekud

Raamatukogu Eesmärk kood
baas Loetlege puuduvad tähelepanekud
colnames(df)[apply(df, 2, anyNA)]
dplyr Eemaldage kõik puuduvad väärtused
na.omit(df)

Arvutamist keskmise või mediaaniga saab teha kahel viisil

  • Rakenduse kasutamine
  • Sapply kasutamine
Meetod Detailid Eelised Puudused
Rakendamisega samm-sammult Kontrollige puuduvaid veerge, arvutage keskmine/mediaan, salvestage väärtus, asendage käsuga mute() Teate keskmise/mediaani väärtust Rohkem täitmisaega. Suure andmestikuga võib see olla aeglane
Kiire viis sapplyga Kasutage sapply() ja data.frame() puuduvate väärtuste automaatseks otsimiseks ja asendamiseks keskmise/mediaaniga Lühikood ja kiire Ei tea imputeerimisväärtusi