Skaičiavimas pagal kelias grupes - kartais vadinamas „kryžminio tabulo“ ataskaitomis - gali būti naudingas būdas peržiūrėti duomenis, pradedant visuomenės nuomonės tyrimais ir baigiant medicininiais tyrimais. Pavyzdžiui, kaip žmonės balsavo pagal lytį ir amžiaus grupes? Kiek programinės įrangos kūrėjų, naudojančių R ir Python, yra vyrai, palyginti su moterimis?
Yra daug būdų, kaip atlikti tokį skaičiavimą pagal kategorijas R. Čia norėčiau pasidalinti keletu savo mėgstamiausių.
Šio straipsnio demonstracijoms naudosiu „Stack Overflow Developers“ apklausos pogrupį, kuriame kūrėjai apklausiami dešimtimis temų, pradedant atlyginimais ir baigiant naudojamomis technologijomis. Aš jį sutrumpinsiu vartojamų kalbų, lyties ir, jei jie koduoja kaip hobį, stulpeliais. Aš taip pat pridėjau savo „LanguageGroup“ stulpelį, norėdamas sužinoti, ar kūrėjas pranešė, kad naudoja R, Python, abu ar ne.
Jei norite sekti toliau, paskutiniame šio straipsnio puslapyje pateikiamos instrukcijos, kaip atsisiųsti ir susigrumti duomenis, kad gautumėte tą patį duomenų rinkinį, kurį naudoju.
Duomenys turi po vieną eilutę kiekvienam apklausos atsakymui, o keturi stulpeliai yra visi simboliai.
str (mydata) 'data.frame': 83379 obs. iš 4 kintamųjų: $ Lytis: chr "Man" "Man" "Man" "Man" ... $ LanguageWorkedWith: chr "HTML / CSS; Java; JavaScript; Python" "C ++; HTML / CSS; Python" "HTML / CSS "" C; C ++; C #; Python; SQL "... $ Mėgėjų: chr" Taip "" Ne "" Taip "" Ne "... $ LanguageGroup: chr" Python "" Python "" Nei "" "Python "...
Filtravau neapdorotus duomenis, kad kryžkelės būtų lengviau valdomos, įskaitant trūkstamų verčių pašalinimą ir tik dviejų didžiausių lyčių - vyro ir moters - pašalinimą.
Sargų paketas
Taigi, koks yra lyčių suskirstymas kiekvienoje kalbų grupėje? Tokio tipo ataskaitoms duomenų rėmelyje vienas iš mano įrankių yra sargų paketas tabilas ()
funkcija.
Pagrindinis tabilas ()
funkcija grąžina duomenų rėmelį su skaičiais. Pirmasis stulpelio pavadinimas, kurį pridedate prie a tabilas ()
argumentas tampa eilutė, o antrasis - stulpelį.
biblioteka (sargas) tabyl (mydata, Gender, LanguageGroup)Lytis tiek Nei Python R Man 3264 43908 29044 969 Moteris 374 3705 1940 175
Kas yra malonu tabilas ()
ar taip pat labai lengva generuoti procentus. Jei norite matyti kiekvieno stulpelio procentus, o ne neapdorotas sumas, pridėkite adorn_percentages ("col")
. Tada tuos rezultatus galite perkelti į tokią formatavimo funkciją kaipadorn_pct_formatting ()
.
tabyl (mydata, Lytis, LanguageGroup)%>%adorn_percentages ("col")%>%
adorn_pct_formatting (skaitmenys = 1)
Lytis ir viena, ir kita „Python R Man“ 89,7% 92,2% 93,7% 84,7% Moteris 10,3% 7,8% 6,3% 15,3%
Norėdami pamatyti procentus pagal eilutę, pridėkite adorn_percentages ("eilutė")
.
Jei norite pridėti trečią kintamąjį, pvz., „Hobbyist“, taip pat lengva.
tabyl (mydata, Lytis, LanguageGroup, Hobbyist)%>%adorn_percentages ("col")%>%
adorn_pct_formatting (skaitmenys = 1)
Tačiau vizualiai palyginti rezultatus daugiau nei dviem lygmenimis tokiu būdu tampa šiek tiek sunkiau. Šis kodas grąžina a sąrašą su vienu duomenų rėmeliu kiekvienam trečiojo lygio pasirinkimui:
$ Ne lytis, nei vienas, nei „Python R Man“ 79,6% 86,7% 86,4% 74,6% moteris 20,4% 13,3% 13,6% 25,4% $ Taip abiejų lyčių lyčių nei „Python R Man“ 91,6% 93,9% 95,0% 88,0% Moteris 8,4% 6,1% 5,0% 12,0%
„CGPfunctions“ paketas
„CGPfunctions“ pakete verta ieškoti kelių greitų ir paprastų kryžminio skirtuko duomenų vizualizavimo būdų. Įdiekite jį iš CRAN su įprastu install.packages („CGPfunctions“)
.
Pakete yra dvi dominančios funkcijos nagrinėjant kryžkeles: „PlotXTabs“ ()
ir „PlotXTabs2“ ()
. Šis kodas pateikia duomenų juostos diagramas (pirmoji schema pateikiama žemiau):
biblioteka (CGPfunctions)„PlotXTabs“ (mydata)

„PlotXTabs2“ (mano duomenys)
sukuria skirtingos išvaizdos grafiką ir keletą statistinių suvestinių (antrasis grafikas kairėje).
Jei jums nereikia ar norite tų suvestinių, galite jas pašalinti naudodami results.subtitle = NETIESA
, toks kaip„PlotXTabs2“ (mydata, LanguageGroup, Gender, results.subtitle = FALSE)
.

„PlotXTabs2“ ()
turi porą dešimčių argumentų parinkčių, įskaitant pavadinimą, antraštę, legendas, spalvų schemą ir vieną iš keturių siužeto tipų: šonas, rietuvė, mozaika ar procentai. Taip pat yra „ggplot2“ vartotojams pažįstamų parinkčių, tokių kaip „ggtheme“ ir paletė. Daugiau informacijos galite pamatyti funkcijos pagalbos faile.
Vtree paketas
Generuoja „vtree“ paketą grafika kryžminėms lentelėms, o ne grafikams. Veikia pagrindinis vtree ()
funkcija viename kintamajame, pvz
biblioteka (vtree)vtree (mydata, „LanguageGroup“)
gausite šį pagrindinį atsakymą:

Čia nesidomiu numatytomis spalvomis, tačiau galite pakeisti „RColorBrewer“ paletę. vtree paletės argumente naudojama paletė numeriai, o ne vardai; kaip jie sunumeruoti, galite pamatyti vtree paketo dokumentuose. Aš galėčiau pasirinkti 3, pavyzdžiui, „Žalieji“ ir 5 - „Violetiniai“. Deja, šie numatytieji nustatymai suteikia jums intensyvesnę spalvą žemesnis skaičiuoti skaičius, kas ne visada turi prasmę (ir man šiame pavyzdyje netinka). Aš galiu pakeisti numatytąjį elgesį naudodamas rūšiavimas = TIESA
naudoti intensyvesnę spalvą didesnis vertė.
vtree (mydata, "LanguageGroup", paletė = 3, rūšiavimas = TIESA)

Jei pastebite, kad tamsi spalva apsunkina teksto skaitymą, yra keletas variantų. Viena iš galimybių yra naudoti paprastas argumentas, pvzvtree (mydata, „LanguageGroup“, paprastas = TIESA)
. Kita galimybė yra nustatyti vieną užpildo spalvą, o ne paletę, naudojant užpildo spalva
argumentas, pvzvtree (mydata, LanguageGroup ", fillcolor =" # 99d8c9 ")
.
Jei norite peržiūrėti du kryžminio skirtuko ataskaitos kintamuosius, tiesiog pridėkite antrą stulpelio pavadinimą ir paletę arba spalvą, jei nenorite numatytojo. Galite naudoti paprastą parinktį arba nurodyti dvi paletes arba dvi spalvas. Žemiau pasirinkau ne paletes, o konkrečias spalvas, taip pat pasukau grafiką, kad skaityčiau vertikaliai.
vtree (mydata, c („LanguageGroup“, „Lytis“),fillcolor = c (LanguageGroup = "# e7d4e8", Lytis = "# 99d8c9"),
horiz = NETIESA)

Galite pridėti daugiau nei dvi kategorijas, nors augant medžiui skaityti ir sekti tampa šiek tiek sunkiau. Jei jus domina tik kai kurie filialų, galite nurodyti, kurį rodyti su išlaikyti
argumentas. Žemiau aš nustatiau vtree ()
rodyti tik žmones, kurie naudoja R be „Python“ arba kurie naudoja ir „R“, ir „Python“.
vtree (mydata, c („Lytis“, „Kalbų grupė“, „Mėgėjas“),horiz = FALSE, fillcolor = c (LanguageGroup = "# e7d4e8",
Lytis = "# 99d8c9", mėgėjų = "# 9ecae1"),
keep = list (LanguageGroup = c ("R", "Abu")), showcount = FALSE)
Kai medis tampa toks užimtas, manau, kad tai padeda turėti arba skaičiavimas arba procentas kaip mazgo etiketės, o ne abu. Taigi paskutinis argumentas aukščiau pateiktame kode, showcount = NETIESA
, nustato diagramą rodyti tik procentus, o ne skaičiuoti.

Daugiau skaičiuokite pagal grupės parinktis
Yra ir kitų naudingų būdų grupuoti ir skaičiuoti R, įskaitant bazę R, dplyr ir data.table. R bazėje yraxtabs ()
specialiai šiai užduočiai atlikti. Atkreipkite dėmesį į toliau pateiktą formulės sintaksę: tildė, tada vienas kintamasis plius kitas kintamasis.
xtabs (~ LanguageGroup + Lytis, duomenys = mano duomenys)Lytis Kalba Grupė Vyras Moteris abi 3264 374 Nei 43908 3705 „Python“ 29044 1940 R 969 175
dplyr's suskaičiuoti ()
funkcija sujungia „grupuoti pagal“ ir „kiekvienos grupės eilučių skaičiavimą“ į vieną funkciją.
biblioteka (dplyr)my_summary%
skaičius (LanguageGroup, Lytis, Mėgėjų, rūšiavimas = TIESA)
my_summary Kalbų grupė Lyčių mėgėjas n 1 Nei vienas vyras taip 34419 2 „Python“ vyras taip 25093 3 nei vienas vyras ne 9489 4 „Python“ vyras ne 3951 5 abu vyras taip 2807 6 nei viena moteris taip 2250 7 nei viena moteris ne 1455 8 „Python“ moteris taip 1317 9 R vyras taip 757 10 „Python“ moteris ne 623 11 abu vyrai ne 457 12 abi moterys taip 257 13 R vyras ne 212 14 abi moterys ne 117 15 R moteris taip 103 16 R moteris ne 72
Trijose toliau nurodytose kodo eilutėse įkeliu „data.table“ paketą, sukuriu „data.table“ iš savo duomenų ir tada naudoju specialųjį .N
data.table simbolis, reiškiantis eilučių skaičių grupėje.
biblioteka (data.table)mydt <- setDT (mydata)
mydt [, .N, pateikė =. (Kalbų grupė, lytis, mėgėjas)]
Vizualizavimas naudojant „ggplot2“
Kaip ir daugumos duomenų atveju, „ggplot2“ yra geras pasirinkimas apibendrintiems rezultatams vizualizuoti. Pirmasis „ggplot“ grafikas, esantis žemiau, „LanguageGroup“ atvaizduoja X ašyje, o kiekvienos skaičius - Y ašyje. Užpildymo spalva nurodo, ar kas nors sako, kad koduoja kaip pomėgį. „Facet_wrap“ sako: stulpelyje „Lytis“ sukurkite atskirą grafiką kiekvienai vertei.
biblioteka (ggplot2)ggplot (my_summary, aes (LanguageGroup, n, fill = Hobbyist)) +
geom_bar (stat = "tapatybė") +
facet_wrap (facets = vars (Lytis))

Kadangi imtyje yra palyginti nedaug moterų, sunku palyginti lyčių procentus, kai abiejuose grafikuose naudojama ta pati Y ašies skalė. Vis dėlto galiu tai pakeisti, todėl kiekviename grafike naudojama atskira skalė, pridedant argumentą svarstyklės = „free_y“
į facet_wrap ()
funkcija:
ggplot (my_summary, aes (LanguageGroup, n, fill = Hobbyist)) +geom_bar (stat = "tapatybė") +
facet_wrap (facets = vars (Lytis), scales = "free_y")
Dabar lengviau palyginti kelis kintamuosius pagal lytį.
Norėdami gauti daugiau R patarimų, eikite į „Do More With R“ puslapį arba peržiūrėkite „YouTube“ grojaraštį „Do More With R“.
Kitame puslapyje rasite informacijos, kaip atsisiųsti ir apgauti šiame demonstraciniame faile naudojamus duomenis.