לפני מספר שנים הייתי צריך לכתוב מאקרו שיבצע מספר חישובים סטטיסטים פשוטים: ממוצע, מקסימום, מינימום, סטיית תקן וכו' על כל המשתנים הנומרים בטבלה אשר המאקרו יקבל כפרמטר.
לכאורה משהו די פשוט. בעזרת טבלאות ה – dictionary שדיברנו עליהן בעבר ניתן לזהות את המשתנים הנומרים ולאסוף את כולם למקום המתאים ב – proc means. אכן פשוט פרט לנקודה בעייתית אחת – גם משתני תאריך ב – SAS הם משתנים נומרים אבל, כמובן, שאין לכלול אותם בחישובים הסטטיסטים.
בעיה, אבל אנחנו דבקים במשימה ואחרי מעט מחשבה הגעתי למסקנה שאני יכול לזהות את משתני התאריך עפ"י הפורמט שמופעל עליהם – אם על משתנה נומרי יש פורמט של תאריך אז בהגדרה מדובר במשתנה שמכיל תאריך – פשוט מאוד.
באופן טבעי השאלה הבאה היא מהם פורמטים של תאריך? חיפשתי וחיפשתי שאלתי ושאלתי אבל כל המקורות שלי אמרו שאין רשימה מובנית של פורמטי תאריך ב – SAS צריך פשוט לבנות אחת כזאת ידנית. נשמע לי קצת מוזר ובעייתי, ל – SAS יש מאות פורמטים איך אני יודע שלא פספסתי כמה, אבל הזמן דחק והאויב של הטוב זה המצוין אז יצרתי לי רשימה של פורמטי התאריך הנפוצים ביותר והמשכתי הלאה.
השנים עברו ופתאום בעודי עובר להנאתי על התיעוד של הפונקציות ב – SAS (מה, רק אני עושה את זה?) מצאתי את הפתרון – הפונקציה FMTINFO שעבור כל פורמט שהיא מקבלת כפרמטר היא מחזירה לנו מגוון מידע כולל הקטגוריה אליה הוא שייך – מושלם.
ככה זה עובד:
data COLUMNS_FORMATS(keep=var_nm format_:);
set SASHELP.PRDSAL3(obs=1);
array nums {*} _numeric_; * All the numeric variables;
length
Var_NM $32
Format_NM $8
Format_Category $10
Format_Type $10
Format_Desc $50
Format_MinD
Format_MaxD
Format_DefD
Format_MinW
Format_MaxW
Format_DefW 8;
do i=1 to dim(nums);
Var_NM=vname(nums[i]);
Format_NM=vformatn(nums[i]); * We need just the format name without the the width, the dot and the decimal;
Format_Category=fmtinfo(format_nm, 'cat'); * The jackpot!;
Format_Type=fmtinfo(format_nm, 'type');
Format_Desc=fmtinfo(format_nm, 'desc');
Format_MinD=input(fmtinfo(format_nm, 'mind'), 3.); * fmtinfo always returns strings. We convert these values into numbers;
Format_MaxD=input(fmtinfo(format_nm, 'maxd'), 3.);
Format_DefD=input(fmtinfo(format_nm, 'defd'), 3.);
Format_MinW=input(fmtinfo(format_nm, 'minw'), 3.);
Format_MaxW=input(fmtinfo(format_nm, 'maxw'), 3.);
Format_DefW=input(fmtinfo(format_nm, 'defw'), 3.);
output;
end;
run;
חגי