将每个变量循环到SAS宏中

时间:2014-09-29 23:50:18

标签: loops macros sas

我在数据集调查中有几个变量。我想编写一个循环来将每个变量加载到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。

2 个答案:

答案 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;