带proc-sql的Sas宏

带proc-sql的Sas宏,sas,sas-macro,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 <=

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

这里基本上我把每个解释变量都放在变量中。例如 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;

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

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

1) 如果不使用标识符(如“COUNT()为VAR1”)跟踪COUNT()函数,则结果将不会有字段标题。如果你不介意的话,那么你可能不需要担心。但是,如果您导出数据,如果您通过添加“…作为“我的名字”来命名它们,将对您有所帮助


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

您尚未提供此项目的完整背景,因此不清楚这是否适用于您,但我认为这是我应该做的

首先,您在SAS中,在最适合的地方使用SAS—计算事物。使用PROC表示,而不是PROC SQL和数据步骤:

proc means data=estimation n;
var &parameters.;
run;
在没有任何额外工作的情况下,可以在一个漂亮的表中获得所有变量的非缺失值的数量

第二,如果有理由使用procsql,那么用这种方式构造它可能更符合逻辑

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列有助于简化代码(处理多余的逗号有点烦人)。您还可以将其放在逗号的开头和前面

最后,您还可以从数据集而不是宏变量来驱动它。一般来说,我更喜欢这样,因为它在很多方面都更容易处理。如果您的参数列表位于某个数据集中(每行一个参数,在数据集“Parameters”中,“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
).

非常感谢。我没有考虑proc的意思,我会记住你的建议。你的第三个选项看起来很有趣,尽管我承认我不理解。你能更具体地说明你将如何使用这个方法吗?你必须问一个更具体的问题。我为第三个选项发布的是实现完全使用第三个选项(除了它需要数据集
参数
)。
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;