Bila menggunakan summarise
dengan plyr
's ddply
fungsi, kategori kosong dijatuhkan oleh default. Anda dapat mengubah perilaku ini dengan menambahkan .drop = FALSE
. Namun, ini tidak berfungsi saat digunakan summarise
dengan dplyr
. Apakah ada cara lain untuk menjaga kategori kosong dalam hasil?
Berikut contoh data palsu.
library(dplyr)
df = data.frame(a=rep(1:3,4), b=rep(1:2,6))
# Now add an extra level to df$b that has no corresponding value in df$a
df$b = factor(df$b, levels=1:3)
# Summarise with plyr, keeping categories with a count of zero
plyr::ddply(df, "b", summarise, count_a=length(a), .drop=FALSE)
b count_a
1 1 6
2 2 6
3 3 0
# Now try it with dplyr
df %.%
group_by(b) %.%
summarise(count_a=length(a), .drop=FALSE)
b count_a .drop
1 1 6 FALSE
2 2 6 FALSE
Tidak persis seperti yang kuharapkan. Apakah ada dplyr
metode untuk mencapai hasil yang sama seperti .drop=FALSE
di plyr
?
Jawaban:
Sejak dplyr 0.8
group_by
memperoleh.drop
argumen yang melakukan apa yang Anda minta:Satu catatan tambahan untuk disertakan dengan jawaban @ Moody_Mudskipper: Penggunaan
.drop=FALSE
dapat memberikan hasil yang berpotensi tidak terduga ketika satu atau lebih variabel pengelompokan tidak dikodekan sebagai faktor. Lihat contoh di bawah ini:sumber
count
:iris %>% count(Species, group2, .drop=FALSE)
Masalahnya masih terbuka, tetapi sementara itu, terutama karena data Anda sudah difaktorkan, Anda dapat menggunakan
complete
dari "tidyr" untuk mendapatkan apa yang mungkin Anda cari:Jika Anda ingin nilai pengganti menjadi nol, Anda perlu menentukannya dengan
fill
:sumber
ungroup()
sebelum Anda menyelesaikannya. Jika Anda pernah melihatcomplete
tidak benar-benar menyelesaikan,ungroup
mungkin diperlukan.complete(variablewithdroppedlevels, nesting(var1,var2,var3))
(sebenarnya dalam bantuan karenacomplete
saya masih butuh waktu untuk mengetahuinyasolusi dplyr:
Pertama buat df dikelompokkan
kemudian kami meringkas level-level yang terjadi dengan menghitung dengan
n()
kemudian kami menggabungkan hasil kami ke dalam bingkai data yang berisi semua tingkat faktor:
Akhirnya, dalam kasus ini karena kita melihat hitungan,
NA
nilainya diubah menjadi 0.Ini juga dapat diimplementasikan secara fungsional, lihat jawaban: Tambahkan baris ke data yang dikelompokkan dengan dplyr?
Sebuah retasan:
Saya pikir saya akan memposting peretasan mengerikan yang berfungsi dalam kasus ini demi kepentingan. Saya benar-benar ragu Anda harus benar-benar melakukan ini tetapi ini menunjukkan bagaimana
group_by()
menghasilkan atribut seolah-olahdf$b
vektor karakter bukan faktor dengan level. Selain itu, saya tidak berpura-pura memahami ini dengan benar - tetapi saya berharap ini membantu saya belajar - inilah satu-satunya alasan saya mempostingnya!tentukan nilai "out-of-bounds" yang tidak boleh ada dalam set data.
ubah atribut menjadi "trik"
summarise()
:lakukan ringkasannya:
indeks dan ganti semua kemunculan oob_val
yang memberikan tujuan:
sumber
ini tidak persis seperti yang ditanyakan dalam pertanyaan, tetapi setidaknya untuk contoh sederhana ini, Anda bisa mendapatkan hasil yang sama menggunakan xtabs, misalnya:
menggunakan dplyr:
atau lebih pendek:
hasil (sama dalam kedua kasus):
sumber