我在数据集调查中有几个变量。我想编写一个循环来将每个变量加载到SAS宏中。
代码如下。
%let var= r1 r2 r3 ;
DATA survey;
INPUT id sex $ age inc r1 r2 r3 ;
DATALINES;
1 F 35 17 7 2 2
17 M 50 14 5 5 3
33 F 45 6 7 2 7
49 M 24 14 7 5 7
65 F 52 9 4 7 7
81 M 44 11 7 7 7
2 F 34 17 6 5 3
18 M 40 14 7 5 2
34 F 47 6 6 5 6
50 M 35 17 5 7 5
;
%MACRO bvars(input);
proc univariate data = "D:\hsb2" plots;
var &input.;
run;
%MEND bvars;
我只想要& var每次只能为一个变量加载到宏bvars而不是编写以下内容。
%bvars(r1)
%bvars(r2)
%bvars(r3)
.....
这是耗时的,而变量的数量大于100。
答案 0 :(得分:1)
对于幸存中以" r"开头的所有变量,这将运行proc univariate
(所以r1,r2等)。具有var
语句的过程通常接受多个变量。
proc univariate data = survey;
var r:;
run;
如果您希望运行所有数字变量,请将r:
替换为_NUM_
。
如果你想循环遍历变量并且每次有多种方法单独调用函数。通常它们涉及宏do循环(必须在宏内部),如下所示:
%macro looper(inData);
/* List all the variable names */
proc contents data = &inData. out = _colNames noprint;
run;
proc sql noprint;
select name
/* Put the variable names in a macro variable list */
into :colNames separated by " "
from _colNames
/* Get only numeric variables */
where type = 1
order by varnum;
quit;
/* Loop through the variable names */
%do i = 1 %to %sysfunc(countw(&colNames.));
%let colName = %scan(&colNAmes., &i.);
%put &colName.;
/* Your macro call or code here */
/* %bvars(&inData., &colName.) */
%end;
%mend looper;
%looper(sashelp.cars);
熟悉宏%do
循环,proc contents
(或更好的proc datasets
),%scan()
函数以及分配的不同方法可能对您有所帮助宏变量。在线sas文档是一个很好的起点。
答案 1 :(得分:-1)
更新了答案。
您可以使用为每个库(包括工作库)中的每个SAS数据集自动创建的VCOLUMN表。此表包含SAS中每个数据集的每个变量的行。
所以你会做以下事情。我假设你的survery数据集在工作库中。
所以代码执行以下操作; 1.在Vcolumn表中查找数据集,只保留变量的名称(这就是我们需要的全部内容)并将其存储到数据集temp中。 2.对于每个变量,通过调用执行语句运行bvars Marcro。
data temp(keep=name);
set Sashelp.Vcolumn;
where libname = 'WORK' and memname = 'SURVEY';
run;
*Call macro using call execute;
data _null_;
set temp;
call execute ("%bvars("||name||");");
run;