אחת מהפעולות השימושיות היא העברה של דאטה בין סוגי פורמטים: פורמט ארוך ופורמט רחב. לדוגמה כשרוצים שמשתנים מסוימים יהפכו לתצפיות נוספות, או להיפך. נדגים זאת עם הנתונים של penguins, שראינו בפרקים הקודמים. נוסיף שינוי קטן לקובץ שמזהה כל תצפית באמצעות מזהה penguin_id לשם כך אנו משתמשים בפונקציה seq_along שפשוט נותנת וקטור של מספר רץ בהתאם לתצפיות.
5.1.1 רחב לארוך
המבנה הסטנדרטי של הקובץ הוא מבנה רחב - כל פינגויין מופיע בשורה אחת עם כל המשתנים שלו. נניח שאנחנו רוצים להפוך את המבנה לארוך, ושכל פינגויין יופיע מספר פעמים בטבלה, בהתאם לסוג המידע המדווח עליו. לצורך זה נשתמש ב-pivot_longer. הנה תזכורת על המבנה הקיים, והקוד שהופך את המבנה למבנה ארוך:
הארגומנט הראשון קובע את המשתנים שהולכים לעבור “pivot”. במקרה הזה הגדרנו אותו על דרך השלילה (-species אומר שכל המשתנים צריכים להשתתף ב-pivot למעט המשתנה species שנותר כעמודה מופרדת).
הארגומנט names_to קובע את שם העמודה שתכיל את שמות המשתנים במקור, והארגומנט values_to קובע את שם העמודה שתכיל את הערכים שהכילו המשתנים במקור.
5.1.2 ארוך לרחב
הפעולה ההפוכה (הפיכת טבלה ארוכה לטבלה רחבה) יכולה להיעשות באמצעות הפונקציה pivot_wider, באופן הבא:
התחביר של הפקודה מאוד דומה לתחביר של הפקודה הקודמת. שימו לב שבמקרה זה אפשר להגדיר את שמות המשתנים ללא מרכאות, משום שאלו משתנים קיימים ב-longer_penguins והפקודה יודעת לבחור אותם גם ללא ציון שלהם במרכאות.
Tip
נסו להריץ את אותן הפקודות (pivot_longer ואז pivot_wider) על penguins (במקום על penguins_id).
מה שונה בפלט של כל אחת מהפקודות, ומדוע?
5.2 חיבור טבלאות
לעיתים בעבודה עם נתונים נדרש חיבור של נתונים ממקורות שונים (או מאותו מקור המאוחסן בטבלאות שונות). זה מאוד מקובל בעבודה עם דאטהבייס. לדוגמה (בהפשטה) חשבו על חברת אשראי שמצד אחד מאחסנת נתונים על לקוחות (גיל, מגדר, כתובת), ומצד שני מאחסנת נתונים של טראנזקציות (פעולות, קרי, חיובי אשראי. שדות כגון מיקום החיוב וסכום החיוב).
אין סיבה שהטבלה שמאחסנת נתונים של טראנזקציות תכיל גם נתונים של גיל, מגדר, וכתובת, משום שאלו לרוב לא משתנים בין חיוב לחיוב.
אבל יש מקרים שבהם נרצה לחבר בין הנתונים כדי לנתח אותם ביחד. לדוגמה בשביל לחשב מה ממוצע ההוצאה של גברים לעומת נשים. זה דורש חיבור של טבלת הנתונים על לקוחות עם טבלת הטראנזקציות.
נדגים זאת בדוגמה קטנה שבה שתי טבלאות. בטבלה הראשונה נתונים על ארבעה לקוחות פיקטיביים של חברת אשראי. אנחנו נשתמש בפקודה tribble כדי להגדיר את הטבלה בקוד.
ניתן לראות שיש לקוחות שביצעו שתי עסקאות, יש לקוחות שביצעו עסקה אחת, ויש לקוחות שלא ביצעו עסקאות בכלל. אנחנו רוצים לחשב כמה כסף בסך הכל הוציאו לקוחות שמתגוררים בחיפה לעומת לקוחות שמתגוררים בתל-אביב.
נשתמש בפקודה left_join שמחברת בין טבלאות. המשתנה המשותף הוא customer_id והוא יאפשר לנו לחבר בין הטבלאות.
# A tibble: 2 × 2
home_address total_expense
<chr> <dbl>
1 חיפה 139
2 תל-אביב 350
מעבר לפקודה שבה השתמשנו left_join יש עוד פקודות חיבור. הפקודה right_join עושה את אותו הדבר רק במקום לחבר את הטבלה השניה לראשונה היא מחברת את הראשונה לשניה:
customers %>%right_join(transactions)
Joining with `by = join_by(customer_id)`
# A tibble: 5 × 5
customer_id gender home_address expense dealer
<dbl> <chr> <chr> <dbl> <chr>
1 1 גבר חיפה 80 Motty's Shawarma
2 1 גבר חיפה 12 Marina's coffee
3 2 אשה תל-אביב 350 Dekek fuel
4 4 אשה חיפה 35 Train
5 4 אשה חיפה 12 Rokadin's Crossons
הפקודה full_join תשמר ערכים שאין להם התאמה באחת הטבלאות. לדוגמה לקוח מספר 3 (והם יופיעו עם ערך חסר):
customers %>%full_join(transactions)
Joining with `by = join_by(customer_id)`
# A tibble: 6 × 5
customer_id gender home_address expense dealer
<dbl> <chr> <chr> <dbl> <chr>
1 1 גבר חיפה 80 Motty's Shawarma
2 1 גבר חיפה 12 Marina's coffee
3 2 אשה תל-אביב 350 Dekek fuel
4 3 גבר תל-אביב NA <NA>
5 4 אשה חיפה 35 Train
6 4 אשה חיפה 12 Rokadin's Crossons
שימו לב, הפקודות הללו מזהות לבד מהם המשתנים החופפים ומחברות בהתאם. ניתן גם להגדיר חפיפות אם שמות המשתנים אינם זהים בין שתי הטבלאות, על ידי שימוש בארגומנט by.
Note
לגבי שיבושי עברית/אנגלית בקוד ובפלט… 😮💨
בהתייחס לטבלת ה-customers שבה הגדרנו ערכי שדות בעברית: שימו לב שהשדה gender הוגדר לפני השדה home_address אבל מכיוון שאנחנו משתמשים בעברית בהמשך שורות הקוד, זה נראה “כאילו” התוכן של מגדר מופיע אחרי התוכן של עיר (הפוך).
כמו כן גם הטקסט עצמו בעברית בפלט משתבש.
זה בגלל עניין היישור של הקוד משמאל לימין. זו בעיה נפוצה, כשמערבים עברית ואנגלית בקוד, ולוקח זמן להתרגל אליה. תתחילו להתאמן.