Misalkan saya ingin menghitung proporsi nilai yang berbeda dalam setiap kelompok. Sebagai contoh, menggunakan mtcars
data, bagaimana cara menghitung frekuensi relatif dari jumlah roda gigi dengan am (otomatis / manual) dalam sekali jalan dplyr
?
library(dplyr)
data(mtcars)
mtcars <- tbl_df(mtcars)
# count frequency
mtcars %>%
group_by(am, gear) %>%
summarise(n = n())
# am gear n
# 0 3 15
# 0 4 4
# 1 4 8
# 1 5 5
Apa yang ingin saya capai:
am gear n rel.freq
0 3 15 0.7894737
0 4 4 0.2105263
1 4 8 0.6153846
1 5 5 0.3846154
prop.table()
/sweep()
. Juga, dalam pertanyaan lain beberapa orang meminta opsi untuk memasukkan nol perhitungan untuk variabel atau interaksi variabelJawaban:
Coba ini:
Dari sketsa dplyr :
Jadi, setelah itu
summarise
, variabel pengelompokan terakhir yang ditentukan dalamgroup_by
, 'roda gigi', dikupas. Padamutate
langkah ini, data dikelompokkan berdasarkan variabel pengelompokan yang tersisa, inilah dia. Anda dapat memeriksa pengelompokan di setiap langkah dengangroups
.Hasil dari peeling tentu saja tergantung pada urutan variabel pengelompokan dalam
group_by
panggilan. Anda mungkin ingin melakukan selanjutnyagroup_by(am)
, untuk membuat kode Anda lebih eksplisit.Untuk pembulatan dan prettifikasi, silakan merujuk ke jawaban yang bagus oleh @Tyler Rinker.
sumber
sum(n)
berhasil di atasam
grup dan bukan digear
grup juga ...summarise
itu mengatakan kelompok mana yang tersisa. Oh dplyr rocks ...Anda dapat menggunakan
count()
fungsi, yang memiliki perilaku berbeda tergantung pada versidplyr
:dplyr 0.7.1: mengembalikan tabel yang tidak dikelompokkan : Anda perlu mengelompokkan lagi berdasarkan
am
dplyr <0.7.1: mengembalikan tabel yang dikelompokkan , jadi tidak perlu dikelompokkan lagi, meskipun Anda mungkin ingin
ungroup()
memanipulasi nantidplyr 0.7.1
dplyr <0.7.1
Ini menghasilkan tabel yang dikelompokkan , jika Anda ingin menggunakannya untuk analisis lebih lanjut, mungkin berguna untuk menghapus atribut yang dikelompokkan dengannya
ungroup()
.sumber
dplyr
0.7.1. Itu perhitungan frekuensi secara keseluruhan pada "gear", bukan dalam setiap tingkat "am".@ Henrik lebih baik untuk kegunaan karena ini akan membuat karakter kolom dan tidak lagi numerik tetapi cocok dengan apa yang Anda minta ...
EDIT Karena Spacedman memintanya :-)
sumber
format
metode yang menambahkan tanda persen ... #overkillBerikut adalah fungsi umum yang mengimplementasikan solusi Henrik pada
dplyr
0.7.1.sumber
Error in bind_rows_(x, .id) : Column
am` tidak dapat dikonversi dari numerik ke karakter`Saya menulis fungsi kecil untuk tugas yang berulang ini:
Saya kemudian dapat menggunakannya seperti:
Ia mengembalikan:
sumber
Terlepas dari banyak jawaban, satu pendekatan lagi yang digunakan
prop.table
dalam kombinasi dengandplyr
ataudata.table
.sumber
Jawaban ini didasarkan pada jawaban Matifou.
Pertama saya memodifikasinya untuk memastikan bahwa saya tidak mendapatkan kolom freq dikembalikan sebagai kolom notasi ilmiah dengan menggunakan opsi scipen.
Lalu saya gandakan jawabannya dengan 100 untuk mendapatkan persen daripada desimal untuk membuat kolom freq lebih mudah dibaca sebagai persentase.
sumber