משימה נפוצה כאשר מעבדים נתונים היא להפוך טבלה ארוכה לרחבה או רחבה לשמנה. הפעולה הזו ידוע כ – Transpose או שיחלוף בעברית.
ניתן לעשות את זה גם בעזרת קוד Data Step ידני אבל חוץ מבמקרים מיוחדים מאוד עדיף להשתמש בפונקציה המובנית ב – SAS לשם כך – proc transpose.
לפני שאנחנו מתחילים לזרוק קוד על המסך אנחנו קודם צריכים להבהיר לעצמנו איך תראה הטבלה שאנחנו רוצים לקבל. אילו עמודות ישארו כמו שהם, אילו עמודה או עמודות מכילות את הנתונים עצמם ואילו עמודה או עמודות יהפכו לשורות או להפך.
למשל אם נשתמש בטבלה CLASS המוכרת אפשר למשל להחליט שאנחנו רוצים לקחת את שלושת המדדים שיש בה – גיל, גובה ומשקל – עבור כל תלמיד ולהפוך אותם לשורות כך שלכל תלמיד יהיו 3 שורות. כלומר ליצור טבלה ארוכה ודקה יותר עם עמודה חדשה שתכיל את שם המדד שיהיה בכל שורה ועמודה שניה שתכיל את הערך עצמו:

הקוד כדי לבצע את השחלוף הזה הוא:
proc sort data=SASHELP.CLASS out=CLASS;
by name;
run;
proc transpose data=CLASS out=CLASS_TRANS;
by name;
var age height weight;
run;
העמודה או עמודות אחרי ה – “by” הן אלו שאנחנו רוצים לבצע את פעולת השחלוף עבור כל אחד ואחד מהערכים שמופיעים בהן. כמו כל דבר ב – SAS עמודות שמופיעות ב – "by" חייבות להיות ממויינות ולכן הוספנו את ה – proc sort בהתחלה.
העמודות שמופיעות אחרי ה – "var" הן העמודות שהמכילות את הערכים עצמם שבמקרה הזה אותן אנחנו רוצים להמיר לשורות נפרדות עבור כל תלמיד.
שינוי קטן בקוד יאפשר לנו לתת שמות מוצלחים יותר לעמודות החדשות ש – SAS יצרה עבורנו במקום שמות ברירת המחדל:
proc transpose data=CLASS out=CLASS_TRANS_NICE(rename=(col1=Value)) name=Madad ;
by name;
var age height weight;
run;
כמובן שזה גם עובד הפוך. לא מצאתי טבלה שימושית מוכנה מראש אז קודם נייצר אחת בעצמנו:
proc sql noprint;
create table CARS as
select
Make,
Type,
avg(Invoice) as Average_Invoice
from
SASHELP.CARS
group by
1,2
order by
1;
quit;
עכשיו נגיד שאנחנו רוצים לקבל עמודה נפרדת עבור כל אחד מסוגי המכוניות:

הקוד כדי לבצע את זה הוא:
proc transpose data=CARS out=CARS_TRANS;
by Make;
id type;
var average_invoice;
run;
העמודה שמופיעה אחרי ה – "id" היא העמודה שעבור כל אחד מהערכים שיש בה תיווצר עמודה חדשה בטבלת הפלט.
אפשרות שימושית נוספת היא להוסיף קידומת אחידה לכל העמודות החדשות שנוצרות. זה יכול להיות מאוד שימושי כדי ל"תפוס" את כולן ביחד בעיבודים נוספים בהמשך הדרך כפי שהראנו פה.
proc transpose data=CARS out=CARS_TRANS_PRE(drop=_name_) prefix=Type_;
by Make;
id type;
var average_invoice;
run;
אלו רק חלק מהאפשרויות של proc transpose. הוא נראה קצת מורכב אבל החלק הקשה והחשוב ביותר הוא להבין עם עצמו איזו טבלה אנחנו רוצים לקבל ואז לתרגם את זה ל - proc transpose שיגשים לנו את כל החלומות.
חגי