Fungsi Agregat R: summarise() & group_by() Contoh
โก Ringkasan Cerdas
Fungsi Aggregate di R dengan dplyr menggabungkan banyak baris menjadi satu statistik per grup. Panduan ini menggabungkan group_by() dengan summarise() pada data batting Lahman untuk menghitung rata-rata, jumlah, sebaran, hitungan, dan nilai posisi di seluruh 104,324 observasi.

Dataset yang Digunakan dalam Tutorial Ini
Meringkas suatu variabel memberi Anda gambaran awal tentang data, dan meringkasnya berdasarkan kelompok memberi tahu Anda lebih banyak tentang bagaimana nilai-nilai tersebut terdistribusi. Tutorial ini menunjukkan cara mengagregasi dataset berdasarkan kelompok dengan pustaka dplyr.
Tutorial ini menggunakan dataset batting Lahman. Setelah mengimpornya dan menyimpannya...ping Hanya dengan sembilan kolom yang tercantum di bawah ini, kerangka data kerja memuat 104,324 observasi dan 9 variabel:
- playerID: Kode ID pemain. Faktor
- ID tahun: Tahun. Faktor
- ID tim: Tim. faktor
- lgID: Liga. Faktor: AA AL FL NL PL UA
- AB: Pada kelelawar. numerik
- G: Permainan: jumlah permainan yang dilakukan seorang pemain. numerik
- R: Berlari. numerik
- HR: Homerun. numerik
- SH: Pengorbanan berhasil. numerik
Sebelum Anda melakukan ringkasan, Anda akan melakukan langkah-langkah berikut untuk menyiapkan data:
- Langkah 1: Impor data
- Langkah 2: Pilih variabel yang relevan
- Langkah 3: Urutkan datanya
library(dplyr) # Step 1 data <- read.csv("https://raw.githubusercontent.com/guru99-edu/R-Programming/master/lahman-batting.csv") %>% # Step 2 select(c(playerID, yearID, AB, teamID, lgID, G, R, HR, SH)) %>% # Step 3 arrange(playerID, teamID, yearID)
Praktik yang baik saat Anda mengimpor kumpulan data adalah dengan menggunakan fungsi sekilas() untuk mendapatkan gambaran tentang struktur kumpulan data.
# Structure of the data glimpse(data)
Keluaran:
Observations: 104,324 Variables: 9 $ playerID <fctr> aardsda01, aardsda01, aardsda01, aardsda01, aardsda01, a... $ yearID <int> 2015, 2008, 2007, 2006, 2012, 2013, 2009, 2010, 2004, 196... $ AB <int> 1, 1, 0, 2, 0, 0, 0, 0, 0, 603, 600, 606, 547, 516, 495, ... $ teamID <fctr> ATL, BOS, CHA, CHN, NYA, NYN, SEA, SEA, SFN, ATL, ATL, A... $ lgID <fctr> NL, AL, AL, NL, AL, NL, AL, AL, NL, NL, NL, NL, NL, NL, ... $ G <int> 33, 47, 25, 45, 1, 43, 73, 53, 11, 158, 155, 160, 147, 15... $ R <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 113, 84, 100, 103, 95, 75... $ HR <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 39, 29, 44, 38, 47, 34, 40... $ SH <int> 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 6, ...
meringkaskan()
Sintaks summarise() bersifat dasar dan konsisten dengan kata kerja lain yang disertakan dalam perpustakaan dplyr.
summarise(df, variable_name=condition) arguments: - `df`: Dataset used to construct the summary statistics - `variable_name=condition`: Formula to create the new variable
Lihatlah kode di bawah ini:
summarise(data, mean_run =mean(R))
Code Penjelasan
- summarise(data, mean_run = mean(R)): Membuat variabel bernama mean_run yang merupakan rata-rata kolom yang dijalankan dari dataset.
Keluaran:
## mean_run ## 1 19.20114
Anda dapat menambahkan variabel sebanyak yang Anda inginkan. Anda mengembalikan rata-rata permainan yang dimainkan dan rata-rata pengorbanan yang berhasil.
summarise(data, mean_games = mean(G), mean_SH = mean(SH, na.rm = TRUE))
Code Penjelasan
- mean_SH = mean(SH, na.rm = TRUE): Ringkaslah variabel kedua. Anda menyetel na.rm = TRUE karena kolom SH berisi observasi yang hilang.
Keluaran:
## mean_games mean_SH ## 1 51.98361 2.340085
group_by() vs Tanpa group_by()
Jika digunakan sendiri, summarise() akan menggabungkan seluruh data frame menjadi satu baris, seperti yang ditunjukkan contoh di atas. Kekuatan sebenarnya muncul setelah Anda menambahkan group_by(): dplyr Kemudian, library tersebut menerapkan perhitungan yang sama secara terpisah untuk setiap grup dan mengembalikan satu baris per grup.
Perhatikan bahwa, group_by berfungsi sempurna dengan semua kata kerja lainnya (yaitu mutate(), filter(), arrange(),โฆ).
Akan lebih mudah untuk menggunakan operator saluran pipa ketika Anda memiliki lebih dari satu langkah. Anda dapat menghitung rata-rata homerun berdasarkan liga bisbol.
data %>% group_by(lgID) %>% summarise(mean_run = mean(HR))
Code Penjelasan
- data: Kumpulan data yang digunakan untuk membuat ringkasan statistik
- group_by(lgID): Pisahkan data berdasarkan nilai lgID sebelum melakukan ringkasan.
- summarise(mean_run = mean(HR)): Hitung rata-rata homerun
Keluaran:
## # A tibble: 7 x 2 ## lgID mean_run ## <fctr> <dbl> ## 1 AA 0.9166667 ## 2 AL 3.1270988 ## 3 FL 1.3131313 ## 4 NL 2.8595953 ## 5 PL 2.5789474 ## 6 UA 0.6216216 ## 7 <NA> 0.2867133
Pipe juga berfungsi dengan ggplot(), sehingga seluruh rangkaian dari data mentah hingga grafik jadi tetap berada dalam satu pernyataan. Kode di bawah ini menggabungkan group_by(), summarise(), dan ggplot() untuk menampilkan rata-rata home run per liga sebagai grafik batang.
Anda akan melakukan langkah berikut:
- Langkah 1: Pilih bingkai data
- Langkah 2: Kelompokkan data
- Langkah 3: Ringkas datanya
- Langkah 4: Plot ringkasan statistik
library(ggplot2) # Step 1 data %>% #Step 2 group_by(lgID) %>% #Step 3 summarise(mean_home_run = mean(HR)) %>% #Step 4 ggplot(aes(x = lgID, y = mean_home_run, fill = lgID)) + geom_bar(stat = "identity") + theme_classic() + labs( x = "baseball league", y = "Average home run", title = paste( "Example group_by() with summarise()" ) )
Keluaran:
Fungsi yang Dapat Anda Gunakan di Dalam summarise()
Kata kerja summarise() kompatibel dengan hampir semua fungsi di R. Berikut adalah daftar singkat fungsi berguna yang dapat Anda gunakan bersama dengan summarise():
| Tujuan | fungsi | Deskripsi |
|---|---|---|
| Dasar | berarti() | Rata-rata vektor x |
| median () | Median vektor x | |
| jumlah() | Jumlah vektor x | |
| variasi | sd() | simpangan baku vektor x |
| IQR() | Interkuartil vektor x | |
| Jarak | min () | Minimal vektor x |
| maks() | Maksimum vektor x | |
| kuantil() | Kuantil vektor x | |
| Posisi | pertama() | Gunakan dengan group_by() Pengamatan pertama grup |
| terakhir() | Gunakan dengan group_by(). Pengamatan terakhir kelompok | |
| ke-n() | Gunakan dengan group_by(). pengamatan kelompok yang ke-n | |
| Menghitung | n () | Gunakan dengan group_by(). Hitung jumlah barisnya |
| n_berbeda() | Gunakan dengan group_by(). Hitung jumlah pengamatan yang berbeda |
Bagian-bagian di bawah ini membahas contoh untuk setiap fungsi dalam tabel di atas. Jika Anda baru mengenal pipe dan verb lainnya, mulailah dengan... tutorial memilih, menyaring, dan menyusun.
Fungsi dasar
Pada contoh sebelumnya, Anda tidak menyimpan statistik ringkasan dalam bingkai data.
Anda dapat membuat data frame dari ringkasan dalam dua langkah:
- Langkah 1: Simpan bingkai data untuk digunakan lebih lanjut
- Langkah 2: Gunakan kumpulan data untuk membuat plot garis
Langkah 1) Anda menghitung jumlah rata-rata permainan yang dimainkan menurut tahun.
## Mean ex1 <- data %>% group_by(yearID) %>% summarise(mean_game_year = mean(G)) head(ex1)
Code Penjelasan
- Statistik ringkasan kumpulan data batting disimpan dalam bingkai data ex1.
Keluaran:
## # A tibble: 6 x 2 ## yearID mean_game_year ## <int> <dbl> ## 1 1871 23.42308 ## 2 1872 18.37931 ## 3 1873 25.61538 ## 4 1874 39.05263 ## 5 1875 28.39535 ## 6 1876 35.90625
Langkah 2) Anda menampilkan ringkasan statistik dengan plot garis dan melihat trennya.
# Plot the graph ggplot(ex1, aes(x = yearID, y = mean_game_year)) + geom_line() + theme_classic() + labs( x = "Year", y = "Average games played", title = paste( "Average games played from 1871 to 2016" ) )
Keluaran:
Sub-pengaturan
Fungsi summarise() kompatibel dengan subsetting.
## Subsetting + Median data %>% group_by(lgID) %>% summarise(median_at_bat_league = median(AB), #Compute the median without the zero median_at_bat_league_no_zero = median(AB[AB > 0]))
Code Penjelasan
- median_at_bat_league_no_zero = median(AB[AB > 0]): Variabel AB berisi banyak 0. Anda dapat membandingkan median dari di kelelawar variabel dengan dan tanpa 0.
Keluaran:
## # A tibble: 7 x 3 ## lgID median_at_bat_league median_at_bat_league_no_zero ## <fctr> <dbl> <dbl> ## 1 AA 130 131 ## 2 AL 38 85 ## 3 FL 88 97 ## 4 NL 56 67 ## 5 PL 238 238 ## 6 UA 35 35 ## 7 <NA> 101 101
Jumlah
Fungsi lain yang berguna untuk menggabungkan variabel adalah sum().
Anda dapat memeriksa liga mana yang memiliki homeruns lebih banyak.
## Sum data %>% group_by(lgID) %>% summarise(sum_homerun_league = sum(HR))
Keluaran:
## # A tibble: 7 x 2 ## lgID sum_homerun_league ## <fctr> <int> ## 1 AA 341 ## 2 AL 29426 ## 3 FL 130 ## 4 NL 29817 ## 5 PL 98 ## 6 UA 46 ## 7 <NA> 41
Standar deviasi
Penyebaran data dihitung dengan standar deviasi atau sd() di R.
# Spread data %>% group_by(teamID) %>% summarise(sd_at_bat_league = sd(HR))
Keluaran:
## # A tibble: 148 x 2 ## teamID sd_at_bat_league ## <fctr> <dbl> ## 1 ALT NA ## 2 ANA 8.7816395 ## 3 ARI 6.0765503 ## 4 ATL 8.5363863 ## 5 BAL 7.7350173 ## 6 BFN 1.3645163 ## 7 BFP 0.4472136 ## 8 BL1 0.6992059 ## 9 BL2 1.7106757 ## 10 BL3 1.0000000 ## # ... with 138 more rows
Selisih jumlah home run sangat berbeda antar tim, dan ALT mengembalikan NA karena tim tersebut hanya memiliki satu baris, sehingga deviasi standar tidak dapat dihitung.
Minimal dan maksimal
Anda dapat mengakses vektor minimum dan maksimum dengan fungsi min() dan max().
Kode di bawah menampilkan jumlah permainan terendah dan tertinggi dalam satu musim yang dimainkan oleh seorang pemain.
# Min and max data %>% group_by(playerID) %>% summarise(min_G = min(G), max_G = max(G))
Keluaran:
## # A tibble: 10,395 x 3 ## playerID min_G max_G ## <fctr> <int> ## 1 aardsda01 53 73 ## 2 aaronha01 120 156 ## 3 aasedo01 24 66 ## 4 abadfe01 18 18 ## 5 abadijo01 11 11 ## 6 abbated01 3 153 ## 7 abbeybe01 11 11 ## 8 abbeych01 80 132 ## 9 abbotgl01 5 23 ## 10 abbotji01 13 29 ## # ... with 10,385 more rows
Menghitung
Menghitung observasi per grup selalu bermanfaat. Di R, n() mengembalikan jumlah baris dalam grup saat ini.
Misalnya, kode di bawah ini menghitung jumlah tahun yang dimainkan oleh setiap pemain.
# count observations data %>% group_by(playerID) %>% summarise(number_year = n()) %>% arrange(desc(number_year))
Keluaran:
## # A tibble: 10,395 x 2 ## playerID number_year ## <fctr> <int> ## 1 pennohe01 11 ## 2 joosted01 10 ## 3 mcguide01 10 ## 4 rosepe01 10 ## 5 davisha01 9 ## 6 johnssi01 9 ## 7 kaatji01 9 ## 8 keelewi01 9 ## 9 marshmi01 9 ## 10 quirkja01 9 ## # ... with 10,385 more rows
Pertama dan terakhir
Anda dapat memilih posisi pertama, terakhir, atau ke-n dalam suatu grup.
Misalnya, Anda dapat menemukan tahun pertama dan terakhir setiap pemain.
# first and last data %>% group_by(playerID) %>% summarise(first_appearance = first(yearID), last_appearance = last(yearID))
Keluaran:
## # A tibble: 10,395 x 3 ## playerID first_appearance last_appearance ## <fctr> <int> <int> ## 1 aardsda01 2009 2010 ## 2 aaronha01 1973 1975 ## 3 aasedo01 1986 1990 ## 4 abadfe01 2016 2016 ## 5 abadijo01 1875 1875 ## 6 abbated01 1905 1897 ## 7 abbeybe01 1894 1894 ## 8 abbeych01 1895 1897 ## 9 abbotgl01 1973 1979 ## 10 abbotji01 1992 1996 ## # ... with 10,385 more rows
observasi ke-n
Fungsi nth() melengkapi fungsi first() dan last(). Fungsi ini mengembalikan observasi pada indeks yang Anda berikan di dalam setiap grup.
Misalnya, Anda hanya dapat memfilter tahun kedua tim bermain.
# nth data %>% group_by(teamID) %>% summarise(second_game = nth(yearID, 2)) %>% arrange(second_game)
Keluaran:
## # A tibble: 148 x 2 ## teamID second_game ## <fctr> <int> ## 1 BS1 1871 ## 2 CH1 1871 ## 3 FW1 1871 ## 4 NY2 1871 ## 5 RC1 1871 ## 6 BR1 1872 ## 7 BR2 1872 ## 8 CL1 1872 ## 9 MID 1872 ## 10 TRO 1872 ## # ... with 138 more rows
Jumlah pengamatan yang berbeda
Fungsi n() mengembalikan jumlah baris dalam grup saat ini. Fungsi terkait n_distinct() menghitung nilai unik.
Pada contoh berikutnya, Anda menjumlahkan total pemain yang direkrut tim selama semua periode.
# distinct values data %>% group_by(teamID) %>% summarise(number_player = n_distinct(playerID)) %>% arrange(desc(number_player))
Code Penjelasan
- group_by(teamID): Kelompokkan berdasarkan tim
- rangkum(angka_pemain = n_berbeda(playerID)): Hitung pemain unik per tim
- arrange(desc(number_player)): Urutkan data berdasarkan jumlah pemain
Keluaran:
## # A tibble: 148 x 2 ## teamID number_player ## <fctr> <int> ## 1 CHN 751 ## 2 SLN 729 ## 3 PHI 699 ## 4 PIT 683 ## 5 CIN 679 ## 6 BOS 647 ## 7 CLE 646 ## 8 CHA 636 ## 9 DET 623 ## 10 NYA 612 ## # ... with 138 more rows
Beberapa kelompok
Statistik ringkasan dapat diwujudkan di antara banyak kelompok.
# Multiple groups data %>% group_by(yearID, teamID) %>% summarise(mean_games = mean(G)) %>% arrange(desc(teamID, yearID))
Code Penjelasan
- group_by(yearID, teamID): Kelompokkan berdasarkan tahun ke tim
- summarise(mean_games = mean(G)): Rata-ratakan jumlah permainan yang dimainkan
- arrange(desc(teamID, yearID)): Urutkan data berdasarkan tim dan tahun
Keluaran:
## # A tibble: 2,829 x 3 ## # Groups: yearID [146] ## yearID teamID mean_games ## <int> <fctr> <dbl> ## 1 1884 WSU 20.41667 ## 2 1891 WS9 46.33333 ## 3 1886 WS8 22.00000 ## 4 1887 WS8 51.00000 ## 5 1888 WS8 27.00000 ## 6 1889 WS8 52.42857 ## 7 1884 WS7 8.00000 ## 8 1875 WS6 14.80000 ## 9 1873 WS5 16.62500 ## 10 1872 WS4 4.20000 ## # ... with 2,819 more rows
Filter
Sebelum Anda ingin melakukan suatu operasi, Anda dapat memfilter kumpulan data. Kumpulan datanya dimulai pada tahun 1871, dan analisisnya tidak memerlukan tahun-tahun sebelum tahun 1980.
# Filter data %>% filter(yearID > 1980) %>% group_by(yearID) %>% summarise(mean_game_year = mean(G))
Code Penjelasan
- filter(yearID > 1980): Filter data untuk hanya menampilkan tahun yang relevan (misalnya setelah 1980)
- group_by(yearID): Kelompokkan berdasarkan tahun
- summarise(mean_game_year = mean(G)): Ringkas datanya
Keluaran:
## # A tibble: 36 x 2 ## yearID mean_game_year ## <int> <dbl> ## 1 1981 40.64583 ## 2 1982 56.97790 ## 3 1983 60.25128 ## 4 1984 62.97436 ## 5 1985 57.82828 ## 6 1986 58.55340 ## 7 1987 48.74752 ## 8 1988 52.57282 ## 9 1989 58.16425 ## 10 1990 52.91556 ## # ... with 26 more rows
Ungroup
Terakhir, Anda harus menghapus groundping sebelum mengubah level di mana perhitungan dijalankan. Tanpa ungroup(), summarise() kedua akan tetap beroperasi per pemain.
# Ungroup the data data %>% filter(HR > 0) %>% group_by(playerID) %>% summarise(average_HR_game = sum(HR) / sum(G)) %>% ungroup() %>% summarise(total_average_homerun = mean(average_HR_game))
Code Penjelasan
- filter(HR >0) : Kecualikan homerun nol
- group_by(playerID): grup demi pemain
- summarise(average_HR_game = sum(HR)/sum(G)): Hitung rata-rata homerun berdasarkan pemain
- ungroup(): menghapus grupping
- summarise(total_average_homerun = mean(average_HR_game)): Ringkas datanya
Keluaran:
## # A tibble: 1 x 1 ## total_average_homerun ## <dbl> ## 1 0.06882226
Cara Meringkas Beberapa Kolom dengan across()
Setiap contoh di atas menyebutkan satu kolom pada satu waktu. Ketika statistik yang sama dibutuhkan untuk banyak kolom, across() menerapkannya ke semua kolom tersebut dalam satu panggilan.
# One function, several columns data %>% group_by(lgID) %>% summarise(across(c(R, HR, G), mean, .names = "mean_{.col}")) # Every numeric column at once data %>% group_by(lgID) %>% summarise(across(where(is.numeric), mean, na.rm = TRUE)) # Several functions applied to several columns data %>% group_by(teamID) %>% summarise(across(c(R, HR), list(avg = mean, total = sum)))
Tiga argumen mengendalikan perilaku tersebut:
- .kolom: kolom-kolom yang akan dioperasikan, ditulis dengan bantuan yang sama seperti select(), termasuk where(is.numeric).
- .fns: satu fungsi, atau daftar fungsi bernama yang akan diterapkan pada setiap kolom.
- nama: pola penamaan untuk output, di mana {.col} adalah kolom dan {.fn} adalah nama fungsi.
Fungsi across() menggantikan fungsi pembantu summarise_all(), summarise_at(), dan summarise_if() yang lebih lama di dplyr 1.0.0. Fungsi-fungsi tersebut masih berjalan tetapi sudah digantikan, jadi kode baru harus menggunakan across().
Kesalahan Umum pada Fungsi summarise() dan Cara Memperbaikinya
Empat masalah menjadi penyebab sebagian besar kegagalan agregasi.
- Hasilnya adalah NA. Fungsi mean() dan sum() mengembalikan NA jika ada nilai yang hilang. Tambahkan na.rm = TRUE, seperti contoh mean_SH di atas.
- Pesan โsummarise() telah mengelompokkan outputโ. Grouping Dengan menggunakan dua variabel, hasilnya akan dikelompokkan berdasarkan variabel pertama. Lewatkan `.groups = โdropโ` untuk menghapus pengelompokan tersebut.pingatau panggil ungroup() setelahnya.
- Perhitungan selanjutnya memberikan nilai yang salah. Sebuah data frame tetap dikelompokkan sampai Anda membatalkan pengelompokannya, jadi fungsi summarise() kedua masih dijalankan untuk setiap kelompok. Inilah yang ditunjukkan oleh contoh ungroup().
- Outputnya memiliki lebih banyak baris daripada yang diharapkan. summarise() mengembalikan satu baris per grup, jadi grup yang tidak disengajaping Variabel tersebut mengalikan output. Periksa baris โGroups:โ yang tercetak di atas setiap tibble.
# Drop the grouping as part of the call data %>% group_by(yearID, teamID) %>% summarise(mean_games = mean(G), .groups = "drop")
Fungsi summarise() di R: Referensi Fungsi
Untuk mendapatkan ringkasan berdasarkan grup, pisahkan data terlebih dahulu:
# group by X1, X2, X3 group_by(df, X1, X2, X3)
dan singkirkan tanahnyaping ketika perhitungan berubah level:
ungroup(df)
Tabel di bawah ini mencantumkan setiap fungsi yang digunakan dengan summarise() dalam tutorial ini:
| metode | fungsi | Code |
|---|---|---|
| berarti | berarti |
summarise(df, mean_x1 = mean(x1))
|
| rata-rata | rata-rata |
summarise(df, median_x1 = median(x1)) |
| jumlah | jumlah |
summarise(df, sum_x1 = sum(x1))
|
| standar deviasi | sd |
summarise(df, sd_x1 = sd(x1)) |
| antarkuartil | I.Q.R. |
summarise(df, interquartile_x1 = IQR(x1)) |
| minimum | menit |
summarise(df, minimum_x1 = min(x1)) |
| maksimum | max |
summarise(df, maximum_x1 = max(x1))
|
| kuantil | kuantil |
summarise(df, quantile_x1 = quantile(x1, probs = 0.75))
|
| pengamatan pertama | pertama |
summarise(df, first_x1 = first(x1)) |
| pengamatan terakhir | terakhir |
summarise(df, last_x1 = last(x1)) |
| observasi ke-n | n |
summarise(df, nth_x1 = nth(x1, 2)) |
| jumlah kejadian | n |
summarise(df, n_x1 = n()) |
| jumlah kejadian yang berbeda | n_berbeda |
summarise(df, n_distinct_x1 = n_distinct(x1)) |


