%macro numstats(var = ,file=, format=);
data _null_;
z = find("&var.",'date');
call symput('myeval',z);
run;
%if &myeval. > 0 Or &var. = lpi %then %do;
Proc SQL;
create table &var as
select "&var." as Varname Length = 35, min(a.&var.) as Minimum FORMAT=&format., max(a.&var.) as Maximum FORMAT=&format.,
ROUND(avg(a.&var.),.01) as Mean, count(*) as Total_Count,x.Count_Null, y.Count_Zero
from &file. a
left join (select "&var." as Var, count(*) as Count_Null from &file.
where &var = .) x
on "&var." = x.var
left join (select "&var." as Var, count(&var.) as Count_Zero from &file.
where &var = 0) y
on "&var." = y.var
where &var. > 0
;
quit;
Data &var (rename=(MyNewVar = Minimum MyNewVar2 = Maximum));
Set &var;
MyNewVar = Put(Minimum,Date9.);
MyNewVar2 = Put(Maximum,Date9.);
*if MyNewVar < 0 then MyNewVar = "";
*if MyNewVar2 < 0 then MyNewVar2 = "";
drop Minimum Maximum;
*format myNewVar yymmddn8. myNewVar2 yymmddn8.;
run;
%end;
%else %do;
Proc SQL;
create table &var as
select "&var." as Varname Length = 35, min(a.&var.) as Minimum, max(a.&var.) as Maximum,
ROUND(avg(a.&var.),.01) as Mean, count(*) as Total_Count,x.Count_Null, y.Count_Zero
from &file. a
left join (select "&var." as Var, count(*) as Count_Null from &file.
where &var = .) x
on "&var." = x.var
left join (select "&var." as Var, count(&var.) as Count_Zero from &file.
where &var = 0) y
on "&var." = y.var
where &var. > 0
;
quit;
Data &var (rename=(MyNewVar = Minimum MyNewVar2 = Maximum));
Set &var;
MyNewVar = Put(Minimum,$12.);
MyNewVar2 = Put(Maximum,$12.);
if MyNewVar < 0 then MyNewVar = "";
if MyNewVar2 < 0 then MyNewVar2 = "";
drop Minimum Maximum;
run;
%end;
%mend numstats;
我有一个宏设置,它通过一个预定义的变量(var)并检查它是数字还是日期数字,然后相应地格式化使用SQL代码生成的统计信息。
代码正常运行。我的问题是需要逐个调用数字变量。例如,
%numstats(var = originalprincipalbalance,file=work.filename);.
该文件有许多数字列,列会不时更改。有没有办法为它设置SAS来查找所有数字变量并通过这个宏运行它们而不必逐个调用它们?
我希望这会显着减少必须错误检查每个文件中的所有变量并确保它们都在自己的代码行上运行的人。此外,我必须有七十多行代码,这些代码基本上是相同的,变量是唯一每次都改变的东西。
请帮忙!提前谢谢。
答案 0 :(得分:1)
首先 - 作为 data _null _ 注释,这可能是一个非常复杂的问题解决方案; SAS主要用于内置工具。使用它们。
那就是说 - 直接问题的解决方案相当简单。
您可以从两个实际上相同的来源获取表格中的变量列表。 SASHELP.VCOLUMN
和dictionary.columns
包含各种libnames中所有表中变量(“columns”)的名称,类型和其他属性(对非SAS数据集有一些限制,例如ODBC表等)。 dictionary.columns
中提供了proc sql
,{数字1}}可在SAS数据步骤中使用(作为视图)。
所以:
sashelp.vcolumn
例如,会创建一个宏变量proc sql;
select cats('%numstats(var=',name,',file=filename, format=',format,')')
into :mcalllist separated by ' '
from dictionary.columns
where libname='WORK' and memname='MYDATA' and type='num';
quit;
,其中包含对所有变量的宏的调用。我不知道你如何定义文件名 - 如果它完全相同(和源数据集相同),那么你可以硬编码和/或使用宏变量来定义memname(这是数据集名称) )和文件名宏参数。