Menu

Group by dan summarize di R (aggregate, tapply, dplyr)

Semua cara menghitung statistik per kelompok di R: menghitung dengan table(), tapply() untuk satu statistik per kelompok, antarmuka formula aggregate(), serta group_by() dengan summarize() dari dplyr.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Menghitung baris per kelompok: table()

Pertanyaan group-by yang paling sederhana adalah "ada berapa masing-masing?", dan base R menjawabnya dalam satu pemanggilan. table() menghitung seberapa sering setiap nilai muncul:

Satu kolom memberikan hitungan per nilai; dua kolom memberikan tabulasi silang lengkap (region sebagai baris, plan sebagai kolom). Untuk pertanyaan "berapa persentasenya?", bungkus dengan prop.table(table(...)). table() adalah jalan tercepat menuju jawaban frekuensi di seluruh R; jangan memakai alat yang lebih berat saat yang kamu butuhkan hanya hitungan.

Satu statistik per kelompok: tapply()

tapply(values, groups, function) memecah vector pertama berdasarkan vector kedua dan menerapkan fungsinya pada setiap potongan:

Hasilnya adalah vector bernama (label kelompok sebagai nama, statistik sebagai nilai), yang sempurna untuk pencarian cepat (means["EU"]). Namanya berasal dari "table apply": terapkan sebuah fungsi mengikuti tabel pengelompokan. Fungsi ini satu keluarga dengan sapply() dan lapply(), yang dibahas di dokumentasi keluarga apply.

Batasan tapply() adalah bentuknya: vector bernama merepotkan untuk di-merge, digambar, atau terus diolah. Saat ringkasannya adalah batu loncatan, bukan jawaban akhir, kamu ingin data frame sebagai hasilnya, dan persis itulah yang dikembalikan alat berikutnya.

Andalan berbasis formula: aggregate()

aggregate() adalah group-by lengkap dari base R: fungsi ini mengembalikan data frame, dan antarmuka formulanya terbaca seperti kalimat yang akan kamu ucapkan. value ~ group berarti "value, dirinci berdasarkan group":

Menambah pengelompok cukup dengan + another_column di formula; pemanggilan kedua menjumlahkan per kombinasi region dan quarter. Kamu juga bisa mengagregasi beberapa kolom nilai sekaligus dengan cbind(a, b) ~ group. Karena output-nya data frame biasa, hasilnya langsung bisa dipakai untuk merge, pengurutan, atau plot; inilah alat base R yang sebaiknya jadi pilihan default untuk ringkasan per kelompok.

Satu perilaku diam-diam yang perlu diketahui: antarmuka formula membuang baris yang berisi NA di kolom mana pun yang dipakai sebelum mengagregasi. Biasanya memang itu yang kamu inginkan; sesekali, itulah penjelasan untuk hitungan yang terlihat terlalu kecil.

Cara dplyr: group_by() + summarize()

Standar modernnya adalah pola dua verb dari dplyr: group_by() menyatakan pengelompokan, summarize() meringkas setiap kelompok menjadi satu baris, menghitung statistik sebanyak yang kamu sebutkan (statis; sandbox ini hanya menjalankan base R):

library(dplyr)

sales |>
    group_by(region) |>
    summarize(
        n     = n(),
        total = sum(amount),
        avg   = mean(amount)
    )

Di sinilah dplyr benar-benar mengungguli base R: banyak statistik per kelompok dalam satu pemanggilan yang mudah dibaca (aggregate() butuh akrobat untuk itu), plus n() tanpa biaya tambahan, dan hasilnya langsung mengalir ke pipe berikutnya. (summarise() adalah fungsi yang sama dengan ejaan Inggris.)

Satu hal yang membingungkan pendatang baru: dengan beberapa pengelompok, summarize() hanya melepas pengelompok terakhir, sehingga hasilnya masih berkelompok, dan mencetak pesan tentang hal itu. Nyatakan apa yang kamu inginkan secara eksplisit dengan argumen .groups: summarize(avg = mean(amount), .groups = "drop") mengembalikan frame biasa yang tidak berkelompok, dan itulah kebiasaan default yang tepat. Frame berkelompok yang menyusup ke kode berikutnya membuat mutate() dan kawan-kawannya diam-diam bekerja per kelompok, sumber klasik hasil yang membingungkan.

Memilih di antara semuanya

  • Hitungan: table(), tidak ada yang mengalahkan satu pemanggilan.
  • Satu statistik, sekilas saja: tapply(), lalu baca jawabannya dari vector bernama.
  • Output data frame, lingkungan yang hanya punya base R: aggregate() dengan formula.
  • Beberapa statistik, bagian dari pipeline, atau apa pun yang ambisius: group_by() |> summarize().

Tidak ada jawaban yang salah di antara semuanya; semuanya menghitung angka yang sama, tapi mencocokkan alat dengan bentuk output yang kamu butuhkan menghemat langkah konversi sesudahnya. Rata-rata, median, dan sebaran itu sendiri dibahas di statistik deskriptif.

Contoh lengkap: mtcars per jumlah silinder

Semuanya digabung pada dataset bawaan: untuk setiap jumlah silinder, berapa banyak mobilnya, serta rata-rata efisiensi bahan bakar dan tenaga kudanya:

Sebelas mobil 4 silinder dengan rata-rata sekitar 26,7 mpg, tujuh mobil 6 silinder sekitar 19,7, empat belas mobil 8 silinder sekitar 15,1, dan tenaga kuda bergerak ke arah sebaliknya. Dua pemanggilan, satu tabel ringkasan utuh: inilah jenis pertanyaan yang membuat agregasi per kelompok ada.

Yang kamu bawa pulang

  • table() untuk hitungan, prop.table() untuk proporsi.
  • tapply(values, groups, fn) mengembalikan vector bernama, untuk melihat sekilas dan pencarian mudah.
  • aggregate(value ~ group, data, FUN) mengembalikan data frame; + menambah pengelompok, cbind() menambah kolom nilai.
  • group_by() |> summarize(n = n(), avg = mean(x), .groups = "drop") dari dplyr adalah standar modern untuk ringkasan dengan banyak statistik.
  • Pilih berdasarkan bentuk output; semuanya sepakat soal angkanya.

Berikutnya: menggabungkan tabel yang punya kunci yang sama, yaitu merge() dan keluarga join dari dplyr.

Pertanyaan yang sering diajukan

Bagaimana cara menghitung rata-rata per kelompok di R?

Base R punya dua alat: tapply(df$value, df$group, mean) mengembalikan vector bernama berisi rata-rata tiap kelompok, dan aggregate(value ~ group, data = df, FUN = mean) mengembalikan hasil yang sama sebagai data frame. Di dplyr: df |> group_by(group) |> summarize(avg = mean(value)).

Bagaimana cara menghitung jumlah kemunculan per kelompok di R?

table(df$group) menghitung baris per nilai kelompok dalam satu pemanggilan; table(df$a, df$b) membuat tabulasi silang dua kolom. Di dplyr, count(df, group) melakukan hal yang sama dan mengembalikan data frame, yang lebih mudah untuk terus diolah.

Apa fungsi aggregate() di R?

aggregate() memecah data frame berdasarkan satu atau lebih kolom pengelompokan, menerapkan sebuah fungsi pada setiap potongan, lalu mengembalikan data frame berisi hasilnya. Antarmuka formulanya terbaca alami: aggregate(sales ~ region + quarter, data = df, FUN = mean) berarti sales, dikelompokkan berdasarkan region dan quarter, lalu dirata-ratakan.

Apa perbedaan tapply dan aggregate?

Perhitungannya sama, bentuk output-nya berbeda. tapply() mengembalikan vector bernama (atau array untuk dua pengelompok), praktis untuk pencarian cepat. aggregate() mengembalikan data frame, lebih baik saat hasilnya dipakai untuk analisis lanjutan, merge, atau plot. Kalau ragu, pakai aggregate().

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai