Saya mengalami masalah dengan kerangka data dan saya sendiri tidak bisa menyelesaikan masalah itu:
Kerangka data memiliki sifat sewenang-wenang sebagai kolom dan setiap baris mewakili satu set data .
Pertanyaannya adalah:
Bagaimana cara menyingkirkan kolom di mana untuk SEMUA baris nilainya NA ?
Dua pendekatan yang ditawarkan sejauh ini gagal dengan set data besar sebagai (di antara masalah memori lainnya) yang mereka buat
is.na(df)
, yang akan menjadi objek dengan ukuran yang samadf
.Berikut adalah dua pendekatan yang lebih hemat memori dan waktu
Pendekatan menggunakan
Filter
dan pendekatan menggunakan data.table (untuk efisiensi waktu dan memori umum)
contoh menggunakan data besar (30 kolom, 1e6 baris)
sumber
data.frame
. Tidak ada yang perlu di sinidata.table
. Kuncinya adalahlapply
, yang menghindari salinan seluruh objek yang dilakukan olehis.na(df)
. +10 untuk menunjukkannya.bd1 <- bd[, unlist(lapply(bd, function(x), !all(is.na(x))))]
,
setelahfunction(x)
- terima kasih untuk contoh btwdplyr
sekarang memilikiselect_if
kata kerja yang mungkin berguna di sini:sumber
dplyr
solusinya. Tidak kecewa. Terima kasih!Cara lain adalah dengan menggunakan
apply()
fungsi tersebut.Jika Anda memiliki data.frame
maka Anda dapat menggunakan
apply()
untuk melihat kolom mana yang memenuhi kondisi Anda dan sehingga Anda dapat melakukan subsetting yang sama seperti dalam jawaban oleh Musa, hanya denganapply
pendekatan.sumber
Terlambat ke permainan tetapi Anda juga dapat menggunakan
janitor
paket. Fungsi ini akan menghapus kolom yang semuanya NA, dan dapat diubah untuk menghapus baris yang semuanya NA juga.df <- janitor::remove_empty(df, which = "cols")
sumber
sumber
Jawaban yang diterima tidak berfungsi dengan kolom non-numerik. Dari jawaban ini , berikut ini berfungsi dengan kolom yang berisi tipe data berbeda
sumber
Opsi lain dengan
purrr
paket:sumber
Saya harap ini juga dapat membantu. Itu bisa dibuat menjadi satu perintah, tetapi saya merasa lebih mudah bagi saya untuk membaca dengan membaginya dalam dua perintah. Saya membuat fungsi dengan instruksi berikut dan bekerja dengan cepat.
naColsRemoval = function (DataTable) { na.cols = DataTable [ , .( which ( apply ( is.na ( .SD ) , 2 , all ) ) )] DataTable [ , unlist (na.cols) := NULL , with = F] }
.SD akan memungkinkan untuk membatasi verifikasi menjadi bagian dari tabel, jika Anda mau, tetapi akan menjadikan seluruh tabel sebagai
sumber
Pilihan praktis
base R
bisa berupacolMeans()
:sumber
Anda dapat menggunakan paket Petugas Kebersihan
remove_empty
Juga, pendekatan dplyr lain
ATAU
ini juga berguna jika Anda hanya ingin mengecualikan / menyimpan kolom dengan sejumlah nilai yang hilang misalnya
sumber