我最近编写了一个宏来轻松创建多个“Proc freqs”,只需输入变量和条件“where”(如果有的话)。 它通常有效,但当我的条件“where”包含“AND”时,我仍然在努力使其工作。
这是宏:
options mprint minoperator;
%macro check(var1=,var2=,var3=, cond=);
Proc freq data= &dataset_full.;
Table &var1.
%if &var2. NE %str() %then
* &var2. ;
%if &var3. NE %str() %then
* &var3. ;
/ out="&var1. &var2. &var3." norow nocol nopercent;
%if &cond. NE %str() %then
&cond.;
;
Run;
%mend;
例如,我可以写
%check(var1=age,var2=weight, cond=where age=1 and weight=10)
。
不会有错误,它只是不会将我的条件应用于输出。根据 MPRINT 输出,“cond”就像是空的。
相反,如果我的条件包含“OR”,则效果很好。
我尝试过使用 str(), %eval 但不起作用。
2分
您可能应该对 Tables 语句上的 out= 选项进行一些操作。您必须指定 SAS 数据集名称(不在“”中)。我猜你想在名称中指定你的输入变量。请参阅下面的代码。
当使用 %Str 宏函数
屏蔽 cond= 值时,下面的代码有效选项 mprint 小运算符;
%宏检查(var1=,var2=,var3=, cond=);
过程频率数据= &dataset_full.;表&var1。 %如果&var2。 NE %str() %然后 * &var2。 ; %如果&var3。 NE %str() %然后 * &var3。 ; /out=freq_&var1.&var2.&var3。诺罗诺科尔诺珀森特; %如果&条件。 NE %str() %然后 &条件。; ;运行;
%修复;
%let dataset_full = sashelp.class;
%check(var1=年龄,var2=体重,cond=其中年龄=1且体重=10);