Cara mengira mengikut kumpulan di R

Mengira oleh pelbagai kumpulan - kadang-kadang disebut laporan taburan - boleh menjadi cara yang berguna untuk melihat data mulai dari tinjauan pendapat umum hingga ujian perubatan. Sebagai contoh, bagaimana orang mengundi mengikut jantina dan kumpulan umur? Berapa banyak pembangun perisian yang menggunakan kedua-dua R dan Python adalah lelaki berbanding wanita?

Terdapat banyak cara untuk melakukan pengiraan ini mengikut kategori dalam R. Di sini, saya ingin berkongsi beberapa kegemaran saya.

Untuk demo dalam artikel ini, saya akan menggunakan subset tinjauan Stack Overflow Developers, yang meninjau pemaju mengenai puluhan topik mulai dari gaji hingga teknologi yang digunakan. Saya akan mengecilkannya dengan lajur untuk bahasa yang digunakan, jantina, dan jika mereka kod sebagai hobi. Saya juga menambahkan lajur LanguageGroup saya sendiri untuk mengetahui sama ada pembangun melaporkan menggunakan R, Python, keduanya, atau tidak.

Sekiranya anda ingin mengikuti, halaman terakhir artikel ini mempunyai arahan mengenai cara memuat turun dan mengelirukan data untuk mendapatkan set data yang sama yang saya gunakan.

Data memiliki satu baris untuk setiap respons tinjauan, dan keempat lajur semuanya terdiri dari watak.

str (mydata) 'data.frame': 83379 obs. daripada 4 pemboleh ubah: $ Jantina: chr "Man" "Man" "Man" "Man" ... $ LanguageWorkedWith: chr "HTML / CSS; Java; JavaScript; Python" "C ++; HTML / CSS; Python" "HTML / CSS "" C; C ++; C #; Python; SQL "... $ Hobi: chr" Ya "" Tidak "" Ya "" Tidak "... $ LanguageGroup: chr" Python "" Python "" Ni "" Python "...

Saya menyaring data mentah untuk menjadikan crosstabs lebih terkawal, termasuk membuang nilai yang hilang dan hanya mengambil dua jantina terbesar, Lelaki dan Wanita.

Pakej kebersihan

Jadi, apakah pecahan jantina dalam setiap kumpulan bahasa? Untuk jenis pelaporan ini dalam kerangka data, salah satu alat masuk saya adalah tabyl()fungsi pakej kebersihan . 

tabyl()Fungsi asas mengembalikan bingkai data dengan jumlah. Nama lajur pertama yang anda tambahkan pada tabyl()argumen menjadi baris , dan yang kedua lajur

perpustakaan (janitor) tabyl (mydata, Gender, LanguageGroup)

Jantina Kedua-duanya Tidak Python R Lelaki 3264 43908 29044 969 Wanita 374 3705 1940 175

Apa yang menarik tabyl()adalah sangat mudah untuk menghasilkan persen. Sekiranya anda ingin melihat peratus bagi setiap lajur dan bukannya jumlah mentah, tambahkan adorn_percentages("col"). Anda kemudian boleh memasukkan hasil tersebut ke fungsi pemformatan seperti  adorn_pct_formatting().

tabyl (mydata, Gender, LanguageGroup)%>%

adorn_percentages ("col")%>%

adorn_pct_formatting (digit = 1)

Jantina Kedua-duanya Baik Python R Man 89.7% 92.2% 93.7% 84.7% Wanita 10.3% 7.8% 6.3% 15.3%

Untuk melihat peratus mengikut baris, tambahkan adorn_percentages("row")

Sekiranya anda ingin menambahkan pemboleh ubah ketiga, seperti Hobbyist, itu juga mudah.

tabyl (mydata, Gender, LanguageGroup, Hobbyist)%>%

adorn_percentages ("col")%>%

adorn_pct_formatting (digit = 1)

Namun, agak sukar untuk membandingkan hasil secara visual di lebih dari dua tahap dengan cara ini. Kod ini mengembalikan senarai dengan satu kerangka data untuk setiap pilihan tahap ketiga:

$ Tidak Jantina Kedua-duanya Baik Python R Man 79.6% 86.7% 86.4% 74.6% Wanita 20.4% 13.3% 13.6% 25.4% $ Ya Jantina Kedua-dua Python R Man 91.6% 93.9% 95.0% 88.0% Wanita 8.4% 6.1% 5.0% 12.0%

Pakej CGPfungsi

Pakej CGPfunctions patut dicari untuk beberapa cara cepat dan mudah untuk memvisualisasikan data tabungan. Pasang dari CRAN dengan biasa install.packages("CGPfunctions").

Pakej ini mempunyai dua fungsi menarik untuk memeriksa crosstabs: PlotXTabs()dan PlotXTabs2(). Kod ini mengembalikan graf bar data (grafik pertama di bawah):

perpustakaan (CGPfungsi)

PlotXTabs (mydata)

Rakaman skrin oleh Sharon Machlis,

PlotXTabs2(mydata) membuat grafik dengan rupa yang berbeza, dan beberapa ringkasan statistik (grafik kedua di sebelah kiri).

Sekiranya anda tidak memerlukan atau menginginkan ringkasan tersebut, anda boleh membuangnya results.subtitle = FALSEseperti, seperti  PlotXTabs2(mydata, LanguageGroup, Gender, results.subtitle = FALSE).

Rakaman skrin oleh Sharon Machlis,

PlotXTabs2()mempunyai beberapa lusin pilihan argumen, termasuk tajuk, kapsyen, legenda, skema warna, dan salah satu daripada empat jenis plot: sisi, timbunan, mosaik, atau persen. Terdapat juga pilihan yang tidak asing lagi bagi pengguna ggplot2, seperti ggtheme dan palet. Anda dapat melihat lebih banyak butiran dalam fail bantuan fungsi.

Pakej vtree

Pakej vtree menghasilkan grafik untuk crosstabs berbanding grafik. Menjalankan vtree()fungsi utama pada satu pemboleh ubah, seperti 

perpustakaan (vtree)

vtree (mydata, "Kumpulan Bahasa")

memberi anda respons asas ini:

Sharon Machlis,

Saya tidak berminat dengan lalai warna di sini, tetapi anda boleh menukar palet RColorBrewer. Argumen palet vtree menggunakan nombor palet , bukan nama; anda dapat melihat bagaimana mereka bernombor dalam dokumentasi pakej vtree. Saya boleh memilih 3 untuk Hijau dan 5 untuk Purple, misalnya. Malangnya, lalai tersebut memberi anda warna yang lebih kuat untuk bilangan kiraan yang lebih rendah , yang tidak selalu masuk akal (dan tidak sesuai untuk saya dalam contoh ini). Saya boleh mengubah tingkah laku lalai dengan sortfill = TRUEmenggunakan warna yang lebih kuat untuk nilai yang lebih tinggi

vtree (mydata, "LanguageGroup", palet = 3, sortfill = BENAR)

Sharon Machlis,

Sekiranya anda mendapati warna gelap menyukarkan membaca teks, terdapat beberapa pilihan. Salah satu pilihan adalah menggunakan argumen biasa , seperti  vtree(mydata, "LanguageGroup", plain = TRUE). Pilihan lain adalah menetapkan warna pengisian tunggal dan bukan palet, menggunakan fillcolorargumen, seperti  vtree(mydata, LanguageGroup", fillcolor = "#99d8c9").

Untuk melihat dua pemboleh ubah dalam laporan tab silang, cukup tambahkan nama lajur kedua dan palet atau warna jika anda tidak menginginkan lalai. Anda boleh menggunakan pilihan biasa atau menentukan dua palet atau dua warna. Di bawah ini saya memilih warna tertentu dan bukannya palet, dan saya juga memutarkan grafik untuk membaca secara menegak.

vtree (mydata, c ("Kumpulan Bahasa", "Jantina"),

fillcolor = c (Kumpulan Bahasa = "# e7d4e8", Jantina = "# 99d8c9"),

horiz = SALAH)

Sharon Machlis,

You can add more than two categories, although it gets a bit harder to read and follow as the tree grows. If you’re only interested in some of the branches, you can specify which to display with the keep argument. Below, I set vtree() to show only people who use R without Python or who use both R and Python.

vtree(mydata, c("Gender", "LanguageGroup", "Hobbyist"),

horiz = FALSE, fillcolor = c(LanguageGroup = "#e7d4e8",

Gender = "#99d8c9", Hobbyist = "#9ecae1"),

keep = list(LanguageGroup = c("R", "Both")), showcount = FALSE)

Dengan pokok itu mendapat begitu sibuk, saya fikir ia membantu untuk mempunyai sama ada kiraan atau peratus sebagai label nod, bukan kedua-duanya. Oleh itu, argumen terakhir dalam kod di atas  showcount = FALSE, menetapkan grafik untuk memaparkan hanya persen dan tidak dikira.

Sharon Machlis,

Lebih banyak dikira mengikut pilihan kumpulan

Terdapat kaedah lain yang berguna untuk mengelompokkan dan mengira dalam R, termasuk asas R, dplyr, dan data.tabel. Base R mempunyai  xtabs()fungsi khusus untuk tugas ini. Perhatikan sintaks formula di bawah: tilde dan kemudian satu pembolehubah ditambah pemboleh ubah lain.

xtabs (~ LanguageGroup + Jantina, data = mydata)

Bahasa Jantina Kumpulan Lelaki Wanita Kedua-duanya 3264 374 Baik 43908 3705 Python 29044 1940 R 969 175

count()Fungsi dplyr menggabungkan "kumpulan demi" dan "hitung baris dalam setiap kumpulan" menjadi satu fungsi.

perpustakaan (dplyr)

my_summary%

count(LanguageGroup, Gender, Hobbyist, sort = TRUE)

my_summary LanguageGroup Gender Hobbyist n 1 Neither Man Yes 34419 2 Python Man Yes 25093 3 Neither Man No 9489 4 Python Man No 3951 5 Both Man Yes 2807 6 Neither Woman Yes 2250 7 Neither Woman No 1455 8 Python Woman Yes 1317 9 R Man Yes 757 10 Python Woman No 623 11 Both Man No 457 12 Both Woman Yes 257 13 R Man No 212 14 Both Woman No 117 15 R Woman Yes 103 16 R Woman No 72

In the three lines of code below, I load the data.table package, create a data.table from my data, and then use the special .N data.table symbol that stands for number of rows in a group. 

library(data.table)

mydt <- setDT(mydata)

mydt[, .N, by = .(LanguageGroup, Gender, Hobbyist)]

Visualizing with ggplot2

Seperti kebanyakan data, ggplot2 adalah pilihan yang baik untuk memvisualisasikan hasil yang diringkaskan. Graf ggplot pertama di bawah memplot LanguageGroup pada paksi X dan kiraan bagi masing-masing pada paksi Y. Isi warna menunjukkan sama ada seseorang mengatakan bahawa mereka kod sebagai hobi. Dan, facet_wrap mengatakan: Buat graf yang terpisah untuk setiap nilai dalam lajur Jantina.

perpustakaan (ggplot2)

ggplot (my_summary, aes (LanguageGroup, n, fill = Hobbyist)) +

geom_bar (stat = "identiti") +

facet_wrap (facets = vars (Jantina))

Sharon Machlis,

Oleh kerana terdapat sedikit wanita dalam sampel, sukar untuk membandingkan peratusan antara jantina apabila kedua-dua grafik menggunakan skala paksi-Y yang sama. Saya boleh mengubahnya, jadi setiap grafik menggunakan skala yang terpisah, dengan menambahkan argumen scales = “free_y”ke facet_wrap()fungsi:

ggplot (my_summary, aes (LanguageGroup, n, fill = Hobbyist)) +

geom_bar (stat = "identiti") +

facet_wrap (facets = vars (Jantina), timbangan = "free_y")

Kini lebih mudah membandingkan pelbagai pemboleh ubah mengikut jantina.

Untuk lebih banyak petua R, buka halaman "Lakukan Lebih Banyak Dengan R" di atau lihat senarai main YouTube "Lakukan Lebih Banyak Dengan R".

Lihat halaman seterusnya untuk maklumat mengenai cara memuat turun dan menguraikan data yang digunakan dalam demo ini.