Fungsi Agregat R: Ringkas & Group_by() Contoh
Ringkasan suatu variabel penting untuk mendapatkan gambaran tentang data. Meskipun demikian, meringkas suatu variabel berdasarkan kelompok memberikan informasi yang lebih baik mengenai distribusi data.
Dalam tutorial ini, Anda akan mempelajari cara meringkas kumpulan data berdasarkan grup dengan pustaka dplyr.
Untuk tutorial ini, Anda akan menggunakan kumpulan data pemukulan. Kumpulan data asli berisi 102816 observasi dan 22 variabel. Anda hanya akan menggunakan 20 persen dari kumpulan data ini dan menggunakan variabel berikut:
- 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))
Penjelasan Kode
- 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))
Penjelasan Kode
- 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
Fungsi summerise() tanpa group_by() tidak masuk akal. Ini membuat ringkasan statistik berdasarkan kelompok. Perpustakaan dplyr menerapkan fungsi secara otomatis ke grup yang Anda lewati di dalam kata kerja group_by.
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))
Penjelasan Kode
- data: Kumpulan data yang digunakan untuk membuat ringkasan statistik
- group_by(lgID): Hitung ringkasan dengan mengelompokkan variabel `lgID
- 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
Operator pipa juga bekerja dengan ggplot(). Anda dapat dengan mudah menampilkan ringkasan statistik dengan grafik. Semua langkah didorong ke dalam pipa sampai grafiknya dibuat. Tampaknya lebih visual untuk melihat rata-rata homerun berdasarkan liga dengan bar char. Kode di bawah ini menunjukkan kekuatan menggabungkan group_by(), summarise() dan ggplot() secara bersamaan.
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 dalam ringkasan()
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 | Description |
---|---|---|
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 |
Kita akan melihat contoh untuk setiap fungsi pada tabel 1.
Fungsi dasar
Pada contoh sebelumnya, Anda tidak menyimpan statistik ringkasan dalam bingkai data.
Anda dapat melanjutkan dalam dua langkah untuk menghasilkan kerangka tanggal dari ringkasan:
- 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)
Penjelasan Kode
- 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]))
Penjelasan Kode
- 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
Banyak sekali ketimpangan kuantitas homerun yang dilakukan masing-masing tim.
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 berdasarkan kelompok selalu merupakan ide bagus. Dengan R, Anda dapat menggabungkan jumlah kemunculan dengan n().
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 first() dan last(). Anda dapat mengakses observasi ke-n dalam grup dengan indeks yang akan dikembalikan.
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 observasi dalam grup saat ini. Fungsi tertutup untuk n() adalah n_distinct(), yang menghitung jumlah 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))
Penjelasan Kode
- group_by(teamID): Kelompokkan berdasarkan tahun dan tim
- rangkum(angka_pemain = n_berbeda(playerID)): Hitung jumlah pemain yang berbeda berdasarkan 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))
Penjelasan Kode
- group_by(yearID, teamID): Kelompokkan berdasarkan tahun dan tim
- summarise(mean_games = mean(G)): Ringkaslah jumlah pemain game
- 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))
Penjelasan Kode
- 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 perlu menghapus pengelompokan sebelum Anda ingin mengubah tingkat komputasi.
# 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))
Penjelasan Kode
- 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 pengelompokan
- summarise(total_average_homerun = mean(average_HR_game)): Ringkas datanya
Keluaran:
## # A tibble: 1 x 1 ## total_average_homerun ## <dbl> ## 1 0.06882226
Kesimpulan
Saat Anda ingin mengembalikan ringkasan berdasarkan grup, Anda dapat menggunakan:
# group by X1, X2, X3 group(df, X1, X2, X3)
Anda perlu memisahkan data dengan:
ungroup(df)
Tabel di bawah merangkum fungsi yang Anda pelajari dengan summarise()
metode | fungsi | Kode |
---|---|---|
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)) |
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(x1)) |
jumlah kejadian yang berbeda | n_berbeda |
summarise(df,n_distinct _x1 = n_distinct(x1)) |