Kako brojati po skupinama u R

Brojanje po više skupina - koje se ponekad nazivaju unakrsnim izvješćima - može biti koristan način za promatranje podataka u rasponu od istraživanja javnog mnijenja do medicinskih testova. Primjerice, kako su ljudi glasali prema spolu i dobnoj skupini? Koliko su programeri softvera koji koriste i R i Python muškarci naspram žena?

Postoji puno načina za ovu vrstu brojanja po kategorijama u R. Ovdje bih želio podijeliti neke od svojih omiljenih.

Za demonstracije u ovom članku upotrijebit ću podskup ankete Stack Overflow Developers, koja istražuje programere na desetke tema, od plaća do korištenih tehnologija. Razdvojit ću je stupcima za korištene jezike, spol i ako su kodirani kao hobi. Također sam dodao svoj vlastiti stupac LanguageGroup da li je programer prijavio da koristi R, Python, oboje ili nijedan.

Ako želite nastaviti, zadnja stranica ovog članka sadrži upute o načinu preuzimanja i preuređivanja podataka kako biste dobili isti skup podataka koji koristim.

Podaci imaju jedan redak za svaki odgovor na anketu, a četiri stupca su svi znakovi.

str (mydata) 'data.frame': 83379 obs. od 4 varijable: $ Spol: chr "Man" "Man" "Man" "Man" ... $ LanguageWorkedWith: chr "HTML / CSS; Java; JavaScript; Python" "C ++; HTML / CSS; Python" "HTML / CSS "" C; C ++; C #; Python; SQL "... $ Hobist: chr" Da "" Ne "" Da "" Ne "... $ LanguageGroup: chr" Python "" Python "" Niti "" Python "...

Filtrirao sam sirove podatke kako bih učinio unakrsne tablice lakšim za upravljanje, uključujući uklanjanje vrijednosti koje nedostaju i uzimanje samo dva najveća spola, muškarca i žene.

Podvornički paket

Pa, koja je spolna podjela unutar svake jezične skupine? Za ovu vrstu izvještavanja u podatkovnom okviru, jedan od mojih alata za prijelaz je tabyl()funkcija paketa domara . 

Osnovna tabyl()funkcija vraća okvir podataka s brojanjem. Prvo ime stupca koje dodate tabyl()argumentu postaje redak , a drugo stupac

knjižnica (domar) tabil (mydata, Gender, LanguageGroup)

Spol oba Ni Python R muškarac 3264 43908 29044 969 Žena 374 3705 1940 175

Ono što je lijepo u tome tabyl()je što je vrlo lako generirati i postotke. Ako želite vidjeti postotke za svaki stupac umjesto neobrađenih unosa, dodajte adorn_percentages("col"). Zatim te rezultate možete usmjeriti u funkciju formatiranja kao što je  adorn_pct_formatting().

tabil (mydata, Gender, LanguageGroup)%>%

adorn_percentages ("col")%>%

adorn_pct_formatting (znamenke = 1)

Spol I oboje ni Python R Man 89,7% 92,2% 93,7% 84,7% Žena 10,3% 7,8% 6,3% 15,3%

Da biste vidjeli postotke po retku, dodajte adorn_percentages("row")

Ako želite dodati treću varijablu, poput Hobista, i to je jednostavno.

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

adorn_percentages ("col")%>%

adorn_pct_formatting (znamenke = 1)

Međutim, postaje malo teže vizualno usporediti rezultate na više od dvije razine na ovaj način. Ovaj kod vraća popis s jednim podatkovnim okvirom za svaki odabir treće razine:

$ Bez spola Ni Python R muškarac 79,6% 86,7% 86,4% 74,6% Žena 20,4% 13,3% 13,6% 25,4% $ Da Spol I oboje Python R Man 91,6% 93,9% 95,0% 88,0% Žena 8,4% 6,1% 5,0% 12,0%

Paket CGPfunctions

Paket CGPfunctions vrijedi potražiti za neke brze i jednostavne načine vizualizacije podataka o unakrsnim tablicama. Instalirajte ga iz CRAN-a na uobičajeni način install.packages("CGPfunctions").

Paket ima dvije funkcije od interesa za ispitivanje unakrsnih tablica: PlotXTabs()i PlotXTabs2(). Ovaj kod vraća trakaste grafikone podataka (prvi grafikon u nastavku):

knjižnica (CGPfunkcije)

PlotXTabs (mydata)

Snimak ekrana Sharon Machlis,

PlotXTabs2(mydata) stvara grafikon s drugačijim izgledom i neke statističke sažetke (drugi graf slijeva).

Ako ti sažeci ne trebaju ili ne žele, možeš ih ukloniti pomoću results.subtitle = FALSE, kao što je  PlotXTabs2(mydata, LanguageGroup, Gender, results.subtitle = FALSE).

Snimak ekrana Sharon Machlis,

PlotXTabs2()ima nekoliko desetaka opcija argumenata, uključujući naslov, naslov, legende, shemu boja i jednu od četiri vrste radnje: bočna, hrpa, mozaik ili postotak. Postoje i opcije poznate korisnicima ggplot2, poput ggtheme i palete. Više detalja možete vidjeti u datoteci pomoći funkcije.

Paket vtree

Paket vtree generira grafiku za unakrsne tablice za razliku od grafikona. Pokretanje glavne vtree()funkcije na jednoj varijabli, kao što je 

knjižnica (vtree)

vtree (mydata, "LanguageGroup")

dobiva ovaj osnovni odgovor:

Sharon Machlis,

Ovdje nisam oduševljen zadanim bojama, ali možete zamijeniti u paleti RColorBrewer. argument palete vtree koristi brojeve paleta , a ne imena; možete vidjeti kako su numerirani u dokumentaciji paketa vtree. Na primjer, mogao sam odabrati 3 za zelene i 5 za ljubičaste. Nažalost, te zadane vrijednosti daju vam intenzivniju boju za brojeve nižeg broja, što ne uvijek ima smisla (i ne funkcionira mi dobro u ovom primjeru). Mogu promijeniti to zadano ponašanje sortfill = TRUEda upotrijebim intenzivnije boje za veću vrijednost. 

vtree (mydata, "LanguageGroup", paleta = 3, sortiranje = TRUE)

Sharon Machlis,

Ako utvrdite da vam tamna boja otežava čitanje teksta, postoje neke mogućnosti. Jedna od mogućnosti je korištenje običnog argumenta, kao što je  vtree(mydata, "LanguageGroup", plain = TRUE). Druga je mogućnost postaviti jednu boju ispune umjesto palete, koristeći fillcolorargument, kao što je  vtree(mydata, LanguageGroup", fillcolor = "#99d8c9").

Da biste pogledali dvije varijable u izvješću o unakrsnim tablicama, jednostavno dodajte naziv drugog stupca i paletu ili boju ako ne želite zadane vrijednosti. Možete koristiti običnu opciju ili odrediti dvije palete ili dvije boje. Ispod sam odabrao određene boje umjesto paleta, a također sam rotirao graf kako bih čitao okomito.

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

fillcolor = c (LanguageGroup = "# e7d4e8", Gender = "# 99d8c9"),

horiz = FALSE)

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)

Uz drvo postaje toliko zauzet, mislim da to pomaže da se ni brojati ili postotak kao čvorova naljepnica, ne oboje. Dakle, taj zadnji argument u gornjem kodu,,  showcount = FALSEpostavlja graf tako da prikazuje samo postotke, a ne broji.

Sharon Machlis,

Više broji prema grupnim opcijama

Postoje i drugi korisni načini grupiranja i brojanja u R, uključujući bazu R, dplyr i data.table. Baza R ima  xtabs()funkciju posebno za ovaj zadatak. Primijetite sintaksu formule u nastavku: tilda, a zatim jedna varijabla plus druga varijabla.

xtabs (~ LanguageGroup + Gender, podaci = mydata)

Spol JezikGrupa Muškarac Žena Oba 3264 374 Niti 43908 3705 Python 29044 1940 R 969 175

dplyr-ova count()funkcija kombinira "grupiraj prema" i "broji redove u svakoj grupi" u jednu funkciju.

knjižnica (dplyr)

moj_sažetak%

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

Kao i kod većine podataka, ggplot2 je dobar izbor za vizualizaciju sažetih rezultata. Prvi graf ggplota ispod crta jezičnu grupu na X osi i broj za svaku na Y osi. Boja ispune predstavlja govori li netko da li se bavi hobijem. I, facet_wrap kaže: Napravite zasebni graf za svaku vrijednost u stupcu Spol.

knjižnica (ggplot2)

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

geom_bar (stat = "identitet") +

umotavanje faceta (facets = vars (Gender))

Sharon Machlis,

Budući da je u uzorku relativno malo žena, teško je usporediti postotke po spolovima kada oba grafikona koriste istu ljestvicu osi Y. To mogu promijeniti, tako da svaki graf koristi zasebnu ljestvicu dodavanjem argumenta scales = “free_y”u facet_wrap()funkciju:

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

geom_bar (stat = "identitet") +

umotavanje faseta (fasete = vars (Spol), ljestvice = "free_y")

Sada je lakše usporediti više varijabli prema spolu.

Da biste saznali više R-savjeta, posjetite stranicu "Učinite više s R" na YouTubeu ili pogledajte YouTube "Popis za reprodukciju" Učinite više s R ".

Pogledajte sljedeću stranicu za informacije o načinu preuzimanja i prepiranja podataka korištenih u ovoj demonstraciji.