Cara Mengganti Nilai yang Hilang (NA) dalam R: na.omit & na.rm

Isi kandungan:

Anonim

Nilai yang hilang dalam sains data muncul apabila pemerhatian hilang dalam lajur kerangka data atau mengandungi nilai watak dan bukan nilai angka. Nilai yang hilang mesti dijatuhkan atau diganti untuk membuat kesimpulan yang betul dari data.

Dalam tutorial ini, kita akan belajar bagaimana menangani nilai yang hilang dengan perpustakaan dplyr. perpustakaan dplyr adalah sebahagian daripada ekosistem untuk merealisasikan analisis data.

Dalam tutorial ini, anda akan belajar

  • bermutasi ()
  • Kecualikan Nilai yang Hilang (NA)
  • Imbangkan Nilai Hilang (NA) dengan Purata dan Median

bermutasi ()

Kata kerja keempat di perpustakaan dplyr berguna untuk membuat pemboleh ubah baru atau mengubah nilai pemboleh ubah yang ada.

Kami akan meneruskan dua bahagian. Kami akan belajar bagaimana:

  • tidak termasuk nilai yang hilang dari kerangka data
  • sangka nilai yang hilang dengan min dan median

Kata kerja mutate () sangat mudah digunakan. Kita boleh membuat pemboleh ubah baru mengikuti sintaks ini:

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

Kecualikan Nilai yang Hilang (NA)

Kaedah na.omit () dari perpustakaan dplyr adalah kaedah mudah untuk mengecualikan pemerhatian yang hilang. Menjatuhkan semua NA dari data itu mudah tetapi tidak bermaksud ia adalah penyelesaian yang paling elegan. Semasa analisis, adalah bijak untuk menggunakan pelbagai kaedah untuk menangani nilai yang hilang

Untuk mengatasi masalah pengamatan yang hilang, kami akan menggunakan set data titanic. Dalam set data ini, kami mempunyai akses kepada maklumat penumpang yang berada di dalam kapal semasa tragedi itu. Set data ini mempunyai banyak NA yang perlu dijaga.

Kami akan memuat naik fail csv dari internet dan kemudian memeriksa lajur mana yang mempunyai NA. Untuk mengembalikan lajur dengan data yang hilang, kita dapat menggunakan kod berikut:

Mari muat naik data dan sahkan data yang hilang.

PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/test.csv"df_titanic <- read.csv(PATH, sep = ",")# Return the column names containing missing observationslist_na <- colnames(df_titanic)[ apply(df_titanic, 2, anyNA) ]list_na

Pengeluaran:

## [1] "age" "fare"

Di sini,

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

Memberi nama lajur yang tidak mempunyai data.

Umur dan harga lajur tidak mempunyai nilai.

Kita boleh menjatuhkannya dengan na.omit ().

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

Pengeluaran:

## [1] 1045 13

Set data baru mengandungi 1045 baris berbanding 1309 dengan set data asal.

Meniru data Hilang dengan Purata dan Median

Kami juga dapat menyiratkan (mengisi) nilai yang hilang dengan median atau rata-rata. Amalan yang baik adalah membuat dua pemboleh ubah berasingan untuk min dan median. Setelah dibuat, kita dapat menggantikan nilai yang hilang dengan pemboleh ubah yang baru terbentuk.

Kami akan menggunakan kaedah menerapkan untuk menghitung rata-rata lajur dengan NA. Mari lihat contoh

Langkah 1) Sebelumnya dalam tutorial, kita menyimpan nama lajur dengan nilai yang hilang dalam senarai yang disebut list_na. Kami akan menggunakan senarai ini

Langkah 2) Sekarang kita perlu menghitung min dengan argumen na.rm = BENAR. Hujah ini wajib kerana lajur mempunyai data yang hilang, dan ini memberitahu R untuk mengabaikannya.

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

Penjelasan Kod:

Kami lulus 4 argumen dalam kaedah menerapkan.

  • df: df_titanic [, nama panggilan (df_titanic)% dalam% list_na]. Kod ini akan mengembalikan nama lajur dari objek list_na (iaitu "umur" dan "tambang")
  • 2: Hitung fungsi pada lajur
  • bermaksud: Hitung min
  • na.rm = BENAR: Abaikan nilai yang hilang

Pengeluaran:

## age fare## 29.88113 33.29548

Kami berjaya membuat nilai lajur yang mengandungi pemerhatian yang hilang. Kedua-dua nilai ini akan digunakan untuk menggantikan pemerhatian yang hilang.

Langkah 3) Gantikan Nilai NA

Kata kerja bermutasi dari perpustakaan dplyr berguna dalam membuat pemboleh ubah baru. Kami tidak semestinya mahu mengubah lajur asal sehingga kami dapat membuat pemboleh ubah baru tanpa NA. mutate senang digunakan, kita hanya memilih nama pemboleh ubah dan menentukan cara membuat pemboleh ubah ini. Inilah kod lengkapnya

# Create a new variable with the mean and mediandf_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))

Penjelasan Kod:

Kami membuat dua pemboleh ubah, menggantikan_mean_age dan Repl_mean_fare seperti berikut:

  • substit_mean_age = ifelse (is.na (umur), rata-rata_missing [1], umur)
  • menggantikan_mean_fare = ifelse (is.na (tambang), rata-rata_missing [2], tambang)

Sekiranya usia lajur mempunyai nilai yang tidak ada, kemudian ganti dengan elemen pertama dari rata-rata (rata-rata usia), jika tidak, simpan nilai asalnya. Logik yang sama untuk tambang

sum(is.na(df_titanic_replace$age))

Pengeluaran:

## [1] 263

Lakukan penggantian

sum(is.na(df_titanic_replace$replace_mean_age))

Pengeluaran:

## [1] 0 

Umur lajur asal mempunyai 263 nilai yang hilang sementara pemboleh ubah yang baru dibuat telah menggantikannya dengan min umur berubah.

Langkah 4) Kita juga boleh menggantikan pemerhatian yang hilang dengan median.

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)

Pengeluaran:

Langkah 5) Satu set data besar mungkin mempunyai banyak nilai yang hilang dan kaedah di atas mungkin membebankan. Kita boleh melaksanakan semua langkah di atas dalam satu baris kod menggunakan kaedah sapply (). Walaupun kita tidak akan mengetahui nilai rata-rata dan rata-rata.

sapply tidak membuat bingkai data, jadi kita dapat membungkus fungsi sapply () dalam data.frame () untuk membuat objek bingkai data.

# Quick code to replace missing values with the meandf_titanic_impute_mean < -data.frame(sapply(df_titanic,function(x) ifelse(is.na(x),mean(x, na.rm = TRUE),x)))

Ringkasan

Kami mempunyai tiga kaedah untuk menangani nilai yang hilang:

  • Kecualikan semua pemerhatian yang hilang
  • Meniru dengan min
  • Beri sangka dengan median

Jadual berikut meringkaskan cara membuang semua pemerhatian yang hilang

Perpustakaan Objektif Kod
pangkalan Senaraikan pemerhatian yang hilang
colnames(df)[apply(df, 2, anyNA)]
dplyr Keluarkan semua nilai yang hilang
na.omit(df)

Imputasi dengan min atau median dapat dilakukan dengan dua cara

  • Menggunakan berlaku
  • Menggunakan sapply
Kaedah Perincian Kelebihan Kekurangan
Langkah demi langkah dengan mengaplikasikan Periksa lajur yang hilang, hitung min / median, simpan nilainya, ganti dengan mutate () Anda tahu nilai kaedah / median Lebih banyak masa pelaksanaan. Boleh lambat dengan set data yang besar
Cara cepat dengan sapply Gunakan sapply () dan data.frame () untuk mencari dan mengganti nilai yang hilang secara automatik dengan nilai rata-rata / median Kod pendek dan pantas Tidak tahu nilai pengiraan