Saya memiliki bingkai data dan beberapa kolom memiliki NA
nilai.
Bagaimana cara mengganti NA
nilai - nilai ini dengan nol?
r
dataframe
na
missing-data
imputation
Renato Dinhani
sumber
sumber
Jawaban:
Lihat komentar saya di jawaban @ gsk3. Contoh sederhana:
Tidak perlu mendaftar
apply
. =)EDIT
Anda juga harus melihat pada
norm
paket. Ini memiliki banyak fitur bagus untuk analisis data yang hilang. =)sumber
df[19:28][is.na(df[19:28])] <- 0
Opsi dplyr hibridisasi sekarang sekitar 30% lebih cepat daripada yang ditetapkan oleh subset Base R. Pada kerangka data 100M datapoint
mutate_all(~replace(., is.na(.), 0))
berjalan setengah detik lebih cepat darid[is.na(d)] <- 0
opsi R dasar . Apa yang ingin dihindari seseorang secara khusus adalah menggunakanifelse()
atauif_else()
. (Analisis uji coba lengkap 600 berjalan lebih dari 4,5 jam sebagian besar karena termasuk pendekatan ini.) Silakan lihat analisis benchmark di bawah ini untuk hasil lengkap.Jika Anda kesulitan dengan kerangka data yang besar,
data.table
adalah opsi tercepat: 40% lebih cepat daripada pendekatan Basis R standar . Ini juga memodifikasi data di tempat, secara efektif memungkinkan Anda untuk bekerja dengan data yang hampir dua kali lipat sekaligus.Pengelompokan pendekatan penggantian rapi bermanfaat lainnya
Berlokasi:
mutate_at(c(5:10), ~replace(., is.na(.), 0))
mutate_at(vars(var5:var10), ~replace(., is.na(.), 0))
mutate_at(vars(contains("1")), ~replace(., is.na(.), 0))
contains()
, cobaends_with()
,starts_with()
mutate_at(vars(matches("\\d{2}")), ~replace(., is.na(.), 0))
Persyaratan:
(ganti hanya tipe tunggal dan biarkan tipe lainnya saja.)
mutate_if(is.integer, ~replace(., is.na(.), 0))
mutate_if(is.numeric, ~replace(., is.na(.), 0))
mutate_if(is.character, ~replace(., is.na(.), 0))
Analisis Lengkap -
Diperbarui untuk dplyr 0.8.0: fungsi menggunakan
~
simbol format purrr : menggantifuns()
argumen yang sudah usang .Pendekatan yang diuji:
Kode untuk analisis ini:
Ringkasan Hasil
Boxplot Hasil
Percobaan Scatterplot kode warna (dengan sumbu y pada skala log)
Catatan tentang pemain berkinerja tinggi lainnya
Ketika dataset bertambah besar, Tidyr 's
replace_na
secara historis menarik di depan. Dengan pengumpulan poin data 100M saat ini untuk dijalankan, ia melakukan hampir persis serta Base R For Loop. Saya ingin tahu apa yang terjadi untuk berbagai dataframe ukuran.Contoh tambahan untuk
mutate
dansummarize
_at
dan_all
varian fungsi dapat ditemukan di sini: https://rdrr.io/cran/dplyr/man/summarise_all.html Selain itu, saya menemukan demonstrasi dan koleksi contoh yang membantu di sini: https: //blog.exploratory. io / dplyr-0-5-is-awesome-heres-why-be095fd4eb8aAtribusi dan Penghargaan
Dengan terima kasih khusus kepada:
local()
, dan (dengan bantuan Frank, juga) peran yang dimainkan oleh pemaksaan bisu dalam mempercepat banyak pendekatan ini.coalesce()
fungsi yang dan memperbarui analisis.data.table
fungsi cukup baik untuk akhirnya memasukkannya ke dalam lineup.is.numeric()
sebenarnya diuji.(Tentu saja, tolong jangkau dan beri mereka upvotes, juga jika Anda menganggap pendekatan itu berguna.)
Catatan tentang penggunaan Numerik: Jika Anda memiliki dataset integer murni, semua fungsi Anda akan berjalan lebih cepat. Silakan lihat pekerjaan alexiz_laz untuk informasi lebih lanjut. IRL, saya tidak dapat mengingat menemukan kumpulan data yang mengandung lebih dari 10-15% bilangan bulat, jadi saya menjalankan tes ini pada kerangka data numerik sepenuhnya.
Perangkat Keras Menggunakan CPU 3,9 GHz dengan RAM 24 GB
sumber
df1[j][is.na(df1[j])] = 0
salah, seharusnyadf1[[j]][is.na(df1[[j]])] = 0
forLp_Sbst
sepertinya tidak ada cara orang harus mempertimbangkan untuk mendekati vsforLp_smplfSbst
coalesce()
opsi dan jalankan kembali setiap saat. Terima kasih atas dorongan untuk memperbarui.Untuk satu vektor:
Untuk data.frame, buat fungsi dari yang di atas, lalu
apply
ke kolom.Harap berikan contoh yang dapat direproduksi lain kali seperti yang dijelaskan di sini:
Bagaimana cara membuat contoh R yang hebat yang bisa direproduksi?
sumber
is.na
adalah fungsi generik, dan memiliki metode untuk objekdata.frame
kelas. jadi ini juga akan bekerja padadata.frame
s!methods(is.na)
untuk pertama kalinya, saya seperti whaaa?!? . Saya suka ketika hal-hal seperti itu terjadi! =)contoh dplyr:
Catatan: Ini karya per kolom yang dipilih, jika kita perlu melakukan ini untuk semua kolom, lihat @reidjax 's jawaban menggunakan mutate_each .
sumber
Jika kita mencoba mengganti
NA
s saat mengekspor, misalnya saat menulis ke csv, maka kita dapat menggunakan:sumber
Saya tahu pertanyaannya sudah dijawab, tetapi melakukannya dengan cara ini mungkin lebih bermanfaat bagi beberapa orang:
Tentukan fungsi ini:
Sekarang, setiap kali Anda perlu mengonversi NA dalam vektor menjadi nol, Anda dapat melakukannya:
sumber
Dengan
dplyr
0.5.0, Anda dapat menggunakancoalesce
fungsi yang dapat dengan mudah diintegrasikan ke dalam%>%
pipeline dengan melakukancoalesce(vec, 0)
. Ini menggantikan semua NASvec
dengan 0:Katakanlah kita memiliki bingkai data dengan
NA
s:sumber
Pendekatan yang lebih umum menggunakan
replace()
dalam matriks atau vektor untuk menggantikanNA
untuk0
Sebagai contoh:
Ini juga merupakan alternatif untuk menggunakan
ifelse()
didplyr
sumber
levels(A$x) <- append(levels(A$x), "notAnswered") A$x <- replace(A$x,which(is.na(A$x)),"notAnswered")
which
tidak diperlukan di sini, Anda dapat menggunakannyax1 <- replace(x,is.na(x),1)
.NA
untuk0
hanya dalam satu kolom tertentu dalam bingkai data yang besar dan fungsi inireplace()
bekerja paling efektif sementara juga paling sederhana.Juga dimungkinkan untuk digunakan
tidyr::replace_na
.sumber
Contoh lain menggunakan paket imputeTS :
sumber
Jika Anda ingin mengganti NAS dalam variabel faktor, ini mungkin berguna:
Ini mengubah vektor faktor menjadi vektor numerik dan menambahkan tingkat faktor numerik artifis lain, yang kemudian diubah kembali ke vektor faktor dengan satu "tingkat NA" tambahan pilihan Anda.
sumber
Akan mengomentari pos @ ianmunoz tetapi saya tidak memiliki reputasi yang cukup. Anda dapat menggabungkan
dplyr
'smutate_each
danreplace
untuk mengurusNA
untuk0
pengganti. Menggunakan dataframe dari jawaban @ aL3xa ...Kami menggunakan evaluasi standar (SE) di sini yang mengapa kami membutuhkan garis bawah pada "
funs_
." Kami juga menggunakanlazyeval
'sinterp
/~
dan.
referensi 'segala sesuatu yang kita bekerja dengan', yaitu frame data. Sekarang ada nol!sumber
Kamu bisa menggunakan
replace()
Sebagai contoh:
sumber
NA
s di vektor Anda. Baik untuk vektor kecil seperti pada contoh Anda.x1 <- replace(x,is.na(x),1)
akan berfungsi tanpa mencantumkan nilai indeks secara eksplisit.dplyr
Opsi lain yang kompatibel dengan pipa dengantidyr
metodereplace_na
yang berfungsi untuk beberapa kolom:Anda dapat dengan mudah membatasi misalnya kolom angka:
sumber
Fungsi khusus (
nafill
/setnafill
) untuk tujuan itu ada dalamdata.table
versi terbarusumber
Fungsi sederhana ini diekstrak dari Datacamp dapat membantu:
Kemudian
sumber
Cara mudah untuk menulisnya adalah dengan
if_na
darihablar
:yang mengembalikan:
sumber
Untuk mengganti semua NAS dalam kerangka data yang dapat Anda gunakan:
df %>% replace(is.na(.), 0)
sumber
jika Anda ingin menetapkan nama baru setelah mengubah NAS dalam kolom tertentu dalam kolom kasus ini V3, gunakan Anda juga dapat melakukannya seperti ini
sumber