BookmarkSubscribeRSS Feed
Hagay
SAS Employee

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

 

לכאורה משהו די פשוט. בעזרת טבלאות ה – 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;

חגי

SAS Innovate 2025: Call for Content

Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 16. Read more here about why you should contribute and what is in it for you!

Submit your idea!

Discussion stats
  • 0 replies
  • 352 views
  • 1 like
  • 1 in conversation