在SaS中重复执行宏

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在SaS中重复执行宏相关的知识,希望对你有一定的参考价值。

我正在使用一个实际上将有数千个细分的数据集。为了说明,我附上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。

答案

试试这个:

/* 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;
另一答案

这是一个根据分组变量分割的非宏方法,在本例中,它是按年龄划分的,但您可以将其更改为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; 
另一答案

这是一些代码:

%macro BinData;

%do i = 1 %to 8;

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

%end;

%mend;

%bindata();

以上是关于在SaS中重复执行宏的主要内容,如果未能解决你的问题,请参考以下文章

SAS:使用热键执行 SAS 代码

SAS 程序冷知识——如何在启动sas程序时自动执行一些宏?

使用文件中的代码作为 SAS 宏变量的内容

sas 宏的问题

伪代码转换为SAS宏代码

在宏内部使用变量内部数据集名称时,SAS语法错误22和200