Saya ingin menghapus garis-garis dalam bingkai data ini yang:
a) mengandung NA
s di semua kolom. Di bawah ini adalah contoh kerangka data saya.
gene hsap mmul mmus rnor cfam
1 ENSG00000208234 0 NA NA NA NA
2 ENSG00000199674 0 2 2 2 2
3 ENSG00000221622 0 NA NA NA NA
4 ENSG00000207604 0 NA NA 1 2
5 ENSG00000207431 0 NA NA NA NA
6 ENSG00000221312 0 1 2 3 2
Pada dasarnya, saya ingin mendapatkan bingkai data seperti berikut ini.
gene hsap mmul mmus rnor cfam
2 ENSG00000199674 0 2 2 2 2
6 ENSG00000221312 0 1 2 3 2
b) mengandung NA
s hanya dalam beberapa kolom , jadi saya juga bisa mendapatkan hasil ini:
gene hsap mmul mmus rnor cfam
2 ENSG00000199674 0 2 2 2 2
4 ENSG00000207604 0 NA NA 1 2
6 ENSG00000221312 0 1 2 3 2
final[complete.cases(final),]
?complete.cases
? Jika saya ingin menjaga baris dengan NAS daripada membuang?final[ ! complete.cases(final),]
tidak bekerja sama ...final
apakah variabel dataframe?Coba
na.omit(your.data.frame)
. Sedangkan untuk pertanyaan kedua, coba posting sebagai pertanyaan lain (untuk kejelasan).sumber
rownames(x) <- NULL
.na.omit()
menjatuhkan baris yang berisiNA
dalam kolom apa puntidyr
memiliki fungsi barudrop_na
:sumber
drop_na
. Sebagai contoh,df %>% drop_na()
,df %>% na.omit()
dandrop_na(df)
semua pada dasarnya sama.na.omit
menambahkan info tambahan seperti indeks case yang dihilangkan, dan - yang lebih penting - adalah tidak memungkinkan Anda untuk memilih kolom - ini adalah tempatdrop_na
bersinar.na.omit
dengan atau tanpa pipa, sama seperti Anda dapat menggunakandrop_na
dengan atau tanpa pipa.Saya lebih suka cara berikut untuk memeriksa apakah baris mengandung NAS:
Ini mengembalikan vektor logis dengan nilai yang menunjukkan apakah ada NA dalam satu baris. Anda dapat menggunakannya untuk melihat berapa banyak baris yang harus Anda jatuhkan:
dan akhirnya menjatuhkan mereka
Untuk menyaring baris dengan bagian NAS tertentu, ini menjadi sedikit lebih rumit (misalnya, Anda dapat memberi makan 'akhir [, 5: 6]' untuk 'diterapkan'). Secara umum, solusi Joris Meys tampaknya lebih elegan.
sumber
rowSum(!is.na(final))
tampaknya lebih cocok daripadaapply()
Pilihan lain jika Anda ingin kontrol lebih besar atas bagaimana baris dianggap tidak valid adalah
Menggunakan di atas, ini:
Menjadi:
... di mana hanya baris 5 yang dihapus karena ini adalah satu-satunya baris yang mengandung NAS untuk keduanya
rnor
DANcfam
. Logika boolean kemudian dapat diubah agar sesuai dengan persyaratan spesifik.sumber
Jika Anda ingin mengontrol berapa banyak NA yang valid untuk setiap baris, coba fungsi ini. Untuk banyak set data survei, terlalu banyak respons pertanyaan kosong dapat merusak hasil. Jadi mereka dihapus setelah batas tertentu. Fungsi ini memungkinkan Anda untuk memilih berapa banyak NA yang bisa dimiliki baris sebelum dihapus:
Secara default, ini akan menghilangkan semua NAS:
Atau tentukan jumlah maksimum NA yang diizinkan:
sumber
Jika kinerja adalah prioritas, gunakan
data.table
danna.omit()
dengan param opsionalcols=
.na.omit.data.table
adalah yang tercepat di tolok ukur saya (lihat di bawah), baik untuk semua kolom atau untuk kolom pilih (pertanyaan OP bagian 2).Jika Anda tidak ingin menggunakan
data.table
, gunakancomplete.cases()
.Pada vanila
data.frame
,complete.cases
lebih cepat darina.omit()
ataudplyr::drop_na()
. Perhatikan bahwana.omit.data.frame
tidak mendukungcols=
.Hasil benchmark
Berikut ini adalah perbandingan metode dasar (biru),
dplyr
(merah muda), dandata.table
(kuning) untuk menjatuhkan semua atau memilih pengamatan yang hilang, pada dataset nosional dari 1 juta pengamatan dari 20 variabel numerik dengan kemungkinan independen 5% kemungkinan hilang, dan subset dari 4 variabel untuk bagian 2.Hasil Anda dapat bervariasi berdasarkan panjang, lebar, dan tingkat dataset tertentu Anda.
Catat skala log pada sumbu y.
Skrip patokan
sumber
Menggunakan paket dplyr, kita dapat memfilter NA sebagai berikut:
sumber
drop_na()
Ini akan mengembalikan baris yang memiliki setidaknya SATU nilai non-NA.
Ini akan mengembalikan baris yang memiliki setidaknya DUA nilai non-NA.
sumber
Untuk pertanyaan pertama Anda, saya memiliki kode yang saya rasa nyaman untuk menghilangkan semua NAS. Terima kasih atas @Gregor untuk membuatnya lebih sederhana.
Untuk pertanyaan kedua, kode tersebut hanyalah pergantian dari solusi sebelumnya.
Perhatikan bahwa -5 adalah jumlah kolom dalam data Anda. Ini akan menghilangkan baris dengan semua NAS, karena rowSum menambah hingga 5 dan mereka menjadi nol setelah dikurangi. Kali ini, as.logical diperlukan.
sumber
Kita juga bisa menggunakan fungsi subset untuk ini.
Ini hanya akan memberikan baris yang tidak memiliki NA pada mmul dan rnor
sumber
Saya seorang synthesizer :). Di sini saya menggabungkan jawaban menjadi satu fungsi:
sumber
Dengan asumsi
dat
sebagai kerangka data Anda, output yang diharapkan dapat dicapai dengan menggunakan1.
rowSums
2.
lapply
sumber
Salah satu pendekatan yang baik umum dan menghasilkan kode cukup dibaca adalah dengan menggunakan
filter
fungsi dan variannya dalam paket dplyr (filter_all
,filter_at
,filter_if
):sumber
Fungsi di atas menghapus semua baris dari bingkai data yang memiliki 'NA' di kolom apa pun dan mengembalikan data yang dihasilkan. Jika Anda ingin memeriksa beberapa nilai suka
NA
dan?
ubahdart=c('NA')
fungsi param menjadidart=c('NA', '?')
sumber
Dugaan saya adalah bahwa ini bisa diselesaikan dengan lebih elegan dengan cara ini:
sumber
NA
. Saya pikir yang diinginkan OP adalah:df %>% filter_all(all_vars(!is.na(.)))