Sas宏用proc sql

时间:2013-11-01 22:24:36

标签: sas sas-macro

我想进行一些回归,我想计算每个变量的非缺失观察数。但我还不知道我将使用哪个变量。我想出了以下不起作用的解决方案。有什么帮助吗?

这里基本上我将每个解释变量放在变量中。例如 var1 var 2 - > w1 = var1,w2 = var2。
请注意,我不知道我提前有多少变量,所以我留下十个变量的空间。
然后使用symput存储潜在变量。

data _null_;
cntw=countw(&parameters);
i = 1;
array w{10} $15.;
do while(i <= cntw);
w[i]= scan((&parameters"),i, ' ');
i = i +1;
end;
/* store a variable globally*/
do j=1 to 10;
call symput("explanVar"||left(put(j,3.)), w(j));
end;
run;

我的下一步是使用我存储的变量执行proc sql。它不起作用 如果我的变量少于10个。

proc sql;
select count(&explanVar1), count(&explanVar2), 
 count(&explanVar3), count(&explanVar4), 
  count(&explanVar5), count(&explanVar6),
   count(&explanVar7), count(&explanVar8),
    count(&explanVar9), count(&explanVar10)
from estimation
;quit;

此代码可以使用少于10个变量吗?

2 个答案:

答案 0 :(得分:2)

您尚未提供此项目的完整背景信息,因此目前尚不清楚这是否适合您 - 但我认为这就是我要做的事情。

首先,你在SAS,使用SAS最好的地方 - 计算东西。而不是PROC SQL和数据步骤,使用PROC MEANS:

proc means data=estimation n;
var &parameters.;
run;

在没有任何额外工作的情况下,在一个漂亮的表中获取所有变量的非缺失值的数量。

其次,如果有理由进行PROC SQL,以这种方式构造它可能更合乎逻辑。

proc sql;
select 
%do i = 1 %to %sysfunc(countw(&parameters.));
  count(%scan(&parameters.,&i.) ) as Parameter_&i.,  /* or could reuse the %scan result to name this better*/
%end; count(1)  as Total_Obs
from estimation;
quit;

最终的Total Obs列对于简化代码很有用(处理额外的逗号有点烦人)。你也可以把它放在开头并加上逗号。

您最终还可以从数据集而不是宏变量中驱动它。总的来说,我更喜欢这样,因为它在很多方面更容易处理。如果参数列表位于某个数据集中(每行一个参数,在数据集“参数”中,“var”作为包含参数的列的名称),则可以执行

proc sql;
select cats('%countme(var=',var,')') into :countlist separated by ',' 
  from parameters;
quit;

%macro countme(var=);
count(&var.) as &var._count
%mend countme;

proc sql;
select &countlist from estimation;
quit;

这是我最喜欢的,因为它是最简单的代码,并且很容易修改。如果可以很容易地确定您的潜在参数(或来自dictionary.columns),您甚至可以从估算内容中驱动它。

答案 1 :(得分:0)

我不确定您的SAS宏,但SQL查询将使用这两个注释:

1)如果您没有使用诸如“COUNT()AS VAR1”之类的标识符关注COUNT()函数,则结果将不具有字段标题。如果你没问题,那么你可能不需要担心它。但是,如果您导出数据,如果您通过添加“... AS”MY_NAME来命名它们将对您有所帮助。

2)对于少于10个变量的观察,查询将返回NULL值。因此,不要担心没有获得所有结果,因为只要您查询的表有10个变量的空间(10个单独的字段),您将获得数据。