כיצד לספור לפי קבוצה ב- R.

ספירה לפי קבוצות מרובות - המכונות לעתים דוחות צלבים - יכולה להיות דרך שימושית להסתכל על נתונים החל מסקרי דעת קהל וכלה בבדיקות רפואיות. לדוגמא, איך אנשים הצביעו לפי מין וקבוצת גיל? כמה מפתחי תוכנה המשתמשים הן ב- R והן ב- Python הם גברים לעומת נשים?

ישנן דרכים רבות לעשות סוג זה של ספירה לפי קטגוריות ב- R. כאן אני רוצה לשתף כמה מהמועדפים שלי.

לצורך ההדגמות במאמר זה, אשתמש בקבוצת משנה של סקר Stack Overflow Developers, הסוקר מפתחים על עשרות נושאים הנעים בין משכורות לטכנולוגיות המשמשות. אני אפרק את זה עם עמודות לשפות המשמשות, מגדר, ואם הן מקודדות כתחביב. הוספתי גם את העמודה של LanguageGroup משלי האם מפתח דיווח על שימוש ב- R, Python, שניהם או אף אחד מהם.

אם ברצונך לעקוב אחריו, בדף האחרון של מאמר זה יש הוראות כיצד להוריד ולנתח את הנתונים כדי לקבל את אותה קבוצת נתונים בה אני משתמש.

לנתונים שורה אחת לכל תגובה לסקר, וארבע העמודות כולן תווים.

str (mydata) 'data.frame': 83379 obs. מתוך 4 משתנים: $ מין: chr "Man" "Man" "Man" "Man" ... $ LanguageWorkedWith: chr "HTML / CSS; Java; JavaScript; Python" "C ++; HTML / CSS; Python" "HTML / CSS "" C; C ++; C #; Python; SQL "... $ תחביב: chr" כן "" לא "" כן "" לא "... $ LanguageGroup: chr" Python "" Python "" גם לא "" Python "...

סיננתי את הנתונים הגולמיים בכדי להפוך את הצלבות לניהול יותר, כולל הסרת ערכים חסרים ולקיחת שני המגדרים הגדולים בלבד, גבר ואישה.

חבילת השוער

אז מה הפירוט המגדרי בכל קבוצת שפות? עבור סוג זה של דיווחים במסגרת נתונים, אחד הכלים הנלווים שלי הוא tabyl()פונקציית חבילת השרת . 

tabyl()הפונקציה הבסיסית מחזירה מסגרת נתונים עם ספירות. שם העמודה הראשון שאתה מוסיף tabyl()לוויכוח הופך לשורה והשני לעמודה

ספרייה (שוער) tabyl (mydata, Gender, LanguageGroup)

מין גם לא פיתון R Man 3264 43908 29044 969 אישה 374 3705 1940 175

מה שנחמד עם tabyl()זה שקל מאוד גם לייצר אחוזים. אם ברצונך לראות אחוזים עבור כל עמודה במקום סכומים גולמיים, הוסף adorn_percentages("col"). לאחר מכן תוכל לצנן תוצאות אלה לפונקציית עיצוב כגון  adorn_pct_formatting().

tabyl (mydata, Gender, LanguageGroup)%>%

adorn_percentages ("col")%>%

adorn_pct_formatting (ספרות = 1)

מין גם לא פיתון R גבר 89.7% 92.2% 93.7% 84.7% אישה 10.3% 7.8% 6.3% 15.3%

כדי לראות אחוזים לפי שורה, הוסף adorn_percentages("row")

אם ברצונך להוסיף משתנה שלישי, כגון הוביסט, גם זה קל.

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

adorn_percentages ("col")%>%

adorn_pct_formatting (ספרות = 1)

עם זאת, קצת יותר קשה להשוות בצורה חזותית תוצאות ביותר משתי רמות בדרך זו. קוד זה מחזיר רשימה עם מסגרת נתונים אחת לכל בחירה ברמה השלישית:

$ לא מגדר שניהם גם לא פייתון R גבר 79.6% 86.7% 86.4% 74.6% אישה 20.4% 13.3% 13.6% 25.4% $ כן מין גם לא פייתון גבר 91.6% 93.9% 95.0% 88.0% אישה 8.4% 6.1% 5.0% 12.0%

חבילת CGPfunctions

חבילת CGPfunctions שווה לחפש כמה דרכים מהירות וקלות לדמיין נתוני צלבים. התקן אותו מ- CRAN כרגיל install.packages("CGPfunctions").

לחבילה שתי פונקציות מעניינות לבדיקת פסיכולוג: PlotXTabs()ו PlotXTabs2(). קוד זה מחזיר תרשימי עמודות של הנתונים (הגרף הראשון למטה):

ספרייה (CGPfunctions)

PlotXTabs (mydata)

צילום מסך של שרון מכליס,

PlotXTabs2(mydata) יוצר גרף עם מראה שונה, וכמה סיכומים סטטיסטיים (גרף שני משמאל).

אם אינך זקוק או רוצה את הסיכומים האלה, תוכל להסיר אותם באמצעות results.subtitle = FALSE, כגון  PlotXTabs2(mydata, LanguageGroup, Gender, results.subtitle = FALSE).

צילום מסך של שרון מכליס,

PlotXTabs2()יש כמה עשרות אפשרויות ויכוח, כולל כותרת, כיתוב, אגדות, ערכת צבעים ואחד מארבעת סוגי העלילה: צד, מחסנית, פסיפס או אחוז. ישנן גם אפשרויות המוכרות למשתמשי ggplot2, כגון ggtheme ופלטה. תוכל לראות פרטים נוספים בקובץ העזרה של הפונקציה.

חבילת vtree

חבילת ה- vtree מייצרת גרפיקה לצלבונים לעומת גרפים. הפעלת vtree()הפונקציה העיקרית על משתנה אחד, כגון 

ספרייה (vtree)

vtree (mydata, "LanguageGroup")

נותן לך את התגובה הבסיסית הזו:

שרון מכליס,

אני לא מתלהב מברירות המחדל של הצבעים כאן, אבל אתה יכול להחליף בלוח RColorBrewer. טיעון הצבעים של vtree משתמש במספרי לוחיות ולא בשמות; תוכלו לראות כיצד הם ממוספרים בתיעוד החבילה vtree. יכולתי לבחור 3 לירוקים ו -5 לסגולים, למשל. למרבה הצער, ברירות המחדל הללו מעניקות לך צבע עז יותר למספרי ספירה נמוכים יותר , שלא תמיד הגיוני (ולא עובד טוב עבורי בדוגמה זו). אני יכול לשנות את התנהגות ברירת המחדל הזו באמצעות sortfill = TRUEשימוש בצבע העז יותר לערך הגבוה יותר

vtree (mydata, "LanguageGroup", לוח = 3, sortfill = TRUE)

שרון מכליס,

אם אתה מוצא את הצבע הכהה מקשה על קריאת הטקסט, יש כמה אפשרויות. אפשרות אחת היא להשתמש בטיעון הפשוט , כגון  vtree(mydata, "LanguageGroup", plain = TRUE). אפשרות נוספת היא להגדיר צבע מילוי יחיד במקום פלטה, באמצעות fillcolorהארגומנט, כגון  vtree(mydata, LanguageGroup", fillcolor = "#99d8c9").

כדי להסתכל על שני משתנים בדוח הצלבה, פשוט הוסף שם עמודה שניה וצבעים או צבע אם אינך רוצה את ברירת המחדל. אתה יכול להשתמש באפשרות הרגילה או לציין שתי פלטות או שני צבעים. למטה בחרתי בצבעים ספציפיים במקום בפלטות, וסובבתי את הגרף לקריאה אנכית.

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

fillcolor = c (LanguageGroup = "# e7d4e8", מגדר = "# 99d8c9"),

אופק = FALSE)

שרון מכליס,

אתה יכול להוסיף יותר משתי קטגוריות, אם כי קצת יותר קשה לקרוא ולעקוב אחרי שהעץ גדל. אם אתה מעוניין רק בחלק מהסניפים, תוכל לציין איזה יציג עם keepהטיעון. להלן, הגדרתי vtree()להציג רק אנשים המשתמשים ב- R ללא פייתון או המשתמשים ב- R וב- Python.

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

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

מין = "# 99d8c9", תחביב = "# 9ecae1"),

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

עם העץ מקבל כל כך עסוק, אני חושב שזה יועיל לך גם בספירה או האחוז כמו תוויות צומת, לא שניהם. אז הטיעון האחרון בקוד שלמעלה  showcount = FALSE,, מגדיר את הגרף כך שיציג אחוזים בלבד ולא ספירות.

שרון מכליס,

ספירה נוספת לפי אפשרויות קבוצתיות

ישנן דרכים שימושיות אחרות לקבץ ולספור ב- R, כולל בסיס R, dplyr ו- data.table. לבסיס R יש את  xtabs()הפונקציה במיוחד למשימה זו. שימו לב לתחביר הנוסחה שלמטה: טילדה ואז משתנה אחד בתוספת משתנה אחר.

xtabs (~ LanguageGroup + Gender, data = mydata)

שפה מגדרית קבוצת גבר אישה שניהם 3264 374 לא 43908 3705 פיתון 29044 1940 R 969 175

count()הפונקציה של dplyr משלבת "קבוצה לפי" ו"ספור שורות בכל קבוצה "לפונקציה אחת.

ספרייה (dplyr)

%_summary שלי

ספירה (שפת קבוצה, מין, תחביב, מין = TRUE)

my_summary Language קבוצה מגדרית הוביסט n 1 לא גבר כן 34419 2 פיתון גבר כן 25093 3 לא גבר לא 9489 4 פיתון גבר לא 3951 5 שני הגברים כן 2807 6 אף אישה כן 2250 7 אף אישה לא 1455 8 פיתון אישה כן 1317 9 R גבר כן 757 10 אישה פיתון לא 623 11 שניהם גבר לא 457 12 שניהם אישה כן 257 13 R גבר לא 212 14 שניהם אישה לא 117 15 R אישה כן 103 16 R אישה לא 72

בשלוש שורות הקוד שלמטה, אני טוען את החבילה data.table, יוצר data.table מהנתונים שלי ואז משתמש .Nבסמל data.table המיוחד שמייצג את מספר השורות בקבוצה. 

ספרייה (data.table)

mydt <- setDT (mydata)

mydt [, .N, לפי =. (שפת קבוצה, מין, הוביסט)]

הדמיה עם ggplot2

כמו ברוב הנתונים, ggplot2 הוא בחירה טובה לדמיין תוצאות מסוכמות. גרף ggplot הראשון למטה מתווה את LanguageGroup על ציר ה- X והספירה עבור כל אחד על ציר Y. צבע מילוי מייצג אם מישהו אומר שהוא מקודד כתחביב. וגם, facet_wrap אומר: הכינו גרף נפרד עבור כל ערך בעמודה מין.

ספרייה (ggplot2)

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

geom_bar (stat = "הזהות") +

facet_wrap (פנים = vars (מין))

שרון מכליס,

מכיוון שיש מעט יחסית נשים במדגם, קשה להשוות אחוזים בין מגדרים כאשר שני הגרפים משתמשים באותו סולם של ציר Y. אני יכול לשנות את זה, אם כי, כך שכל גרף משתמש בסולם נפרד, על ידי הוספת הטענה scales = “free_y”אל facet_wrap()הפונקציה:

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

geom_bar (stat = "הזהות") +

facet_wrap (facets = vars (Gender), scales = "free_y")

עכשיו קל יותר להשוות מספר משתנים לפי מין.

לקבלת טיפים נוספים בנושא R, היכנס לדף "עשה יותר עם R" בדף או עיין בפלייליסט של YouTube "עשה יותר עם R".

עיין בעמוד הבא למידע על אופן ההורדה וההתנגשות של נתונים המשמשים בהדגמה זו.