Apakah mungkin untuk memfilter data.frame untuk kasus lengkap menggunakan dplyr? complete.cases
dengan daftar semua variabel bekerja, tentu saja. Tapi itu a) verbose ketika ada banyak variabel dan b) tidak mungkin ketika nama variabel tidak diketahui (misalnya dalam fungsi yang memproses data.frame).
library(dplyr)
df = data.frame(
x1 = c(1,2,3,NA),
x2 = c(1,2,NA,5)
)
df %.%
filter(complete.cases(x1,x2))
complete.cases
tidak hanya menerima vektor. Dibutuhkan kerangka data utuh, juga.dplyr
fungsi filter. Saya kira saya tidak cukup jelas dan memperbarui pertanyaan saya.Jawaban:
Coba ini:
atau ini:
atau ini:
Jika Anda ingin memfilter berdasarkan salah satu variabel yang tidak ada, gunakan kondisional:
atau
Jawaban lain menunjukkan bahwa solusi di atas
na.omit
jauh lebih lambat tetapi harus diseimbangkan dengan fakta bahwa ia mengembalikan indeks baris dari baris yang dihilangkan dalamna.action
atribut sedangkan solusi lain di atas tidak.DITAMBAH Telah diperbarui untuk mencerminkan versi terbaru dplyr dan komentar.
ADDED Telah diperbarui untuk mencerminkan versi terbaru dari tidyr dan komentar.
sumber
na.omit()
berkinerja sangat buruk tetapi yang cepat.df %>% filter(complete.cases(.))
. Tidak yakin apakah perubahan terbaru di dplyr memungkinkan hal ini.drop_na
, sehingga Anda sekarang dapat melakukan:df %>% drop_na()
.Ini bekerja untuk saya:
Atau sedikit lebih umum:
Ini akan memiliki keuntungan bahwa data dapat dimodifikasi dalam rantai sebelum meneruskannya ke filter.
Tolok ukur lain dengan lebih banyak kolom:
sumber
df %>% slice(which(complete.cases(.)))
kinerja ~ 20% lebih cepat daripada pendekatan filter pada tolok ukur di atas.%>% data.frame() %>%
sebelum Anda mencoba dan memfilter complete.cases (.) Karena tidak akan berfungsi tibbles atau tibbles yang dikelompokkan atau sesuatu. Atau setidaknya, itulah pengalaman yang saya alami.Berikut beberapa hasil benchmark untuk balasan Grothendieck. na.omit () membutuhkan waktu 20x lebih lama dari dua solusi lainnya. Saya pikir alangkah baiknya jika dplyr memiliki fungsi untuk ini mungkin sebagai bagian dari filter.
sumber
Ini adalah fungsi singkat yang memungkinkan Anda menentukan kolom (pada dasarnya semua yang
dplyr::select
dapat dipahami) yang seharusnya tidak memiliki nilai NA (dimodelkan setelah pandas df.dropna () ):[ drop_na sekarang menjadi bagian dari tidyr : yang di atas dapat diganti dengan
library("tidyr")
]Contoh:
sumber
coba ini
ATAU bahkan ini
Perintah di atas menangani pemeriksaan kelengkapan untuk semua kolom (variabel) di data.frame Anda.
sumber
dplyr
sebagai bagian dari fungsi filter. Itu akan memungkinkan integrasi rapi dalam rantai dplyr dll.dplyr:::do.data.frame
pernyataan ituenv$. <- .data
menambahkan titik ke lingkungan. Tidak ada pernyataan seperti itu di magrittr :: "%>%" `Hanya demi kelengkapan,
dplyr::filter
bisa dihindari sama sekali tapi tetap bisa merangkai rantai hanya dengan menggunakanmagrittr:extract
(alias[
):Bonus tambahannya adalah kecepatan, ini adalah metode tercepat di antara
filter
danna.omit
varian (diuji menggunakan microbenchmark @Miha Trošt).sumber
extract()
hampir sepuluh kali lebih lambat darifilter()
. Namun, saat saya membuat bingkai data yang lebih kecildf <- df[1:100, 1:10]
, gambar berubah danextract()
menjadi yang tercepat.magrittr::extract
adalah cara tercepat hanya ketikan <= 5e3
di patokan Miha Trošt.