יום רביעי, 31 באוגוסט 2016

הטבלה לא משקרת

בפוסט הקודם (לחצו פה) סקרתי את טיפוס הנתונים categorical, אשר נוסף לסביבת MATLAB בגרסת R2013b. באותה גרסה הצטרף גם טיפוס נתונים שימושי נוסף, table, אשר בו יעסוק הפוסט הנוכחי.

לעתים קרובות אנו מארגנים מידע לצורה של טבלה, בה העמודות השונות מייצגות משתנים שונים אשר אותם מודדים (למשל – משקל, גובה, לחץ דם), והשורות מייצגות תצפיות שונות (בני אדם שונים).
טיפוס המידע table מאפשר עבודה מאוד נוחה עם טבלאות שכאלה, כפי שיפורט בהמשך, אך לצורך הכנסת טבלה לתוך טיפוס המידע הזה חשוב להקפיד ש:
  • ·         כל העמודות בעלות אורך זהה
  • ·         בכל עמודה טיפוס מידע אחיד (עמודות שונות יכולות להיות עם נתונים מטיפוסי מידע שונים)
  • ·         לכל עמודה כותרת ייחודית (כלומר – אין שני משתנים בעלי שם זהה)
הדרישות האלה הן טריוויאליות, אבל עדיין הרגשתי צורך לציין אותן :)

כיצד יוצרים table ?
על מנת לייבא מידע מקבצי Excel לתוך ה-workspace בצורה של table, ניתן להשתמש ב-import tool (קליק כפול על הקובץ, ובחירה באופציה Table בחלון ה- IMPORTED DATA). לחילופין, אפשר להשתמש בפקודה readtable (מומלץ לראות בתיעוד את האפשרויות השונות שהיא מציעה – כולל דרכי הטיפול בנתונים חסרים – לחצו פה לתיעוד). אגב, כפי שיש readtable, יש גם את הפקודה writetable, המאפשרת למשל לשמור table לתוך קובץ Excel.
ניתן גם לבנות טבלה מתוך משתנים אשר קיימים ב-workspace, וזאת באמצעות הפקודה table (דוגמה בהמשך).
ואפשר גם להיעזר בפונקציות המרה אשר ממירות מידע מטיפוס אחד לטיפוס table, למשל – הפונקציה struct2table, אשר ממירה מידע מ-structure array לצורת table.
אגב, אם יש לכם מספר tables – ניתן לאחד אותם. אם מדובר בשני tables המכילים תצפיות שונות של אותם המשתנים – יש לבצע שרשור אנכי – t3=[t1;t2]. ואם מדובר בשני tables שמכילים נתונים שונים על אותן התצפיות (או על חלק מהן) – אפשר להשתמש בפקודות join, innerjoin, outerjoin, תלוי במקרה ובמה שרוצים להשיג.
יצירת table מתוך משתנים קיימים (לחצו להגדלה)
סבבה, יש לי table, איך אני מחלץ ממנו את הנתונים הדרושים לי ?
אפשר לעבוד עם table כמו שעובדים עם כל מטריצה, ובאמצעות אינדקסים נומרים מתאימים לחלץ רק עמודות ושורות רלוונטיות. למשל, על ידי z=t(1:20,[8,10]) נקבל table חדש באורך 20 שורות ושתי עמודות. אבל, כדאי לדעת ש-table מאפשר לחלץ עמודות גם על סמך השם שלהן, ולא רק על סמך המספר שלהן. למשל:  z=t(:,'age'). הנ"ל כמובן תקף גם לגבי שורות.
כדי לגשת למידע עצמו שנמצא בעמודה מסוימת, ולקבל וקטור או מטריצה מטיפוס המידע המקורי של הנתונים (להבדיל ממה שבוצע קודם - שהיה לקבל table קטן יותר) – יש להשתמש באופרטור הנקודה, למשל: z=t.age. דרך אחרת, שמאפשרת לחלץ מספר עמודות יחד לתוך מטריצה אחת (כמובן בהנחה שכל העמודות מאותו טיפוס מידע מקורי), היא שימוש באופרטור הסוגרים המסולסלים, לדוגמה:
z=t{:,{'age','height'}}.

אוקיי, חוץ מניהול נתונים, חילוץ נתונים והדפסה נוחה שלהם, יש עוד משהו
שאפשר לעשות עם
table ?
ברור !
table הוא אובייקט בעל properties שאפשר להפעיל עליו methods. כדי לראות את ה-properties של t, יש להשתמש בסינטקס t.Properties (שימו לב ל-P הגדולה).  כמובן שניתן לשנות את ה-properties השונים, למשל – אפשר לתת כותרות גם לשורות.
שינוי properties של table (לחצו להגדלה)
כאמור, ניתן להפעיל על table פונקציות ספציפיות, methods. כדי לראות את רשימת הפונקציות שניתן להפעיל על t, יש להקליד methods(t). למשל, אפשר למיין את t לפי משתנה מסוים באמצעות המתודה sortrows, או להציג סיכום סטטיסטי על כל משתנה עם המתודה summary.

מיון table לפי עמודת הגיל (לחצו להגדלה)
בנוסף לכתוב לעיל, ניתן להשתמש בפונקציה varfun על מנת להפעיל כל פונקציה שרירותית על כל משתנה שב-table ! למשל, הנה דוגמה בה מבוצע סיכום של העמודות השונות (לחצו להגדלה):

עוד משהו ?
מקווה שהתרשמתם מהיכולות של טיפוס המידע table, וגם אם לא התרשמתם – קחו בחשבון שכדאי להכיר אותו, שכן יש פונקציות אשר מוכנות לקבל רק אותו בתור קלט.
ואם חשבתם שזה הפוסט האחרון בנושא טיפוסי מידע חדשים בסביבת MATLAB, אז דעו לכם שבגרסת R2016b שתצא בחודש הבא צפויים להצטרף עוד מספר טיפוסי מידע חדשים, וכמובן שנעסוק בהם גם פה...