在SaS中重复执行宏

时间:2018-03-02 09:13:24

标签: loops macros sas proc-sql do-loops

我正在使用一个实际上将有数千个细分的数据集。为了说明,我附上了8.

我要做的是为每个细分创建数据集,以便计算每个数据集的贡献。我完成了大部分工作,但我要问的是将此输出的每一行都转换为自己的数据集。

数据集如下所示

ID    Segment    Asset    Mapping    Performing    Fixed 

1     Loan       Asset    Loan1      Performing    Fixed
2     Loan       Asset    Loan1      No            Fixed
3     Loan       Asset    Loan1      P             Floating
4     Loan       Asset    Loan1      N             floating
5     Loan       Asset    Loan2      P             Fixed
...
8     Loan       Asset    Loan2      N             Floating

数据已按上述方式排序。

我写的宏如下:

%macro BinData(i);

Data Bin&i;
set Import;
If _N_ = &i ;
run;

%mend;

有没有这种方法可以重复循环这个宏(在大图中)所有8(1000)段,如:

proc
do x=1 to 8;
%bindata(x);
run;

重点是为每一行创建一个新的细分市场。 TIA。

3 个答案:

答案 0 :(得分:0)

试试这个:

/* Your import data set */
data import;
    id=1;
    segment=1;
    output;
    id=2;
    segment=1;
    output;
    id=3;
    segment=1;
    output;
run;

/* Your macro to separate the rows into different data sets */
%macro temp;
    /* Create a list with all possible id's */
    proc sql noprint;
        SELECT DISTINCT id
        INTO :list separated by '#'
        FROM import
        ;
    quit;
    /* Create for each id a separate data set and output the rows into it */
    data
        %do i=1 %to %sysfunc(countw(&list.,#));
            bin%scan(&list.,&i.,#) 
        %end;
        ;
        set import;
        %do i=1 %to %sysfunc(countw(&list.,#));
            if _n_=&i. then do;
                output bin%scan(&list.,_n_,#);
            end;
        %end;
    run;
%mend;
%temp;

答案 1 :(得分:0)

以下是一些代码:

%macro BinData;

%do i = 1 %to 8;

Data Bin&i;
set Import;
If _N_ = &i;
run;

%end;

%mend;

%bindata();

答案 2 :(得分:0)

这是一种根据分组变量分割的非宏方法,在本例中,它按年龄划分,但您可以将其更改为ID。没有循环,一般来说,WHERE比IF快。

proc sort data=sashelp.class out=class;
by age;
run;

data _null_;
set class;
by age;
retain count;

if first.age then do;
    count+1;

    *create string;
    str1='data sub'||put(count,z3.)||"; set sashelp.class; where age="||put(age, 2.)||";run;";
    call execute(str1);

end;
run;