串联SAS数据集,但保留一个数据集的顺序

时间:2019-05-02 16:44:03

标签: sorting macros sas concatenation sas-macro

我希望添加到作为标准过程一部分的宏。该宏当前汇集了来自不同产品组的多个数据集,如下所示:

%macro test(group=);
data X;
    set
        %if &group = AAA %then %do;
            LIB.AAA1
            LIB.AAA2
            LIB.AAA3
        %end;
        %else %if &group = BBB %then %do;
            LIB.BBB1
            LIB.BBB2
            LIB.BBB3
        %end;
        %else %if &group = CCC %then %do;
            LIB.CCC1
            LIB.CCC2
            LIB.CCC3
        %end;
    ;

    by customer key var1 var2;


    if first.customer then do;
        <logic>
    end;

run;

%mend;

我要实现的目标是插入自己的数据集并保留其顺序以满足新的要求。在更改上面的标准宏时,我还需要这样做,以免影响其余数据和下游进程。

在此宏之前运行的单独程序中,我对数据集进行了排序,并在customerkey之间添加了一个额外的变量。如果仅按上述变量排序,则我的数据集顺序错误,这将导致first.customer宏给出错误的test结果。此额外变量type在其他任何数据集中均不存在。我可以使用现有的变量,但是除非我也可以隔离它,否则它将影响我不想接触的其他数据集的顺序。

我到目前为止的代码:

%macro test(group=);
data X;
    set
        %if &group = AAA %then %do;
            LIB.AAA1
            LIB.AAA2
            LIB.AAA3
        %end;
        %else %if &group = BBB %then %do;
            LIB.MYDATA
            LIB.BBB1
            LIB.BBB2
            LIB.BBB3
        %end;
        %else %if &group = CCC %then %do;
            LIB.CCC1
            LIB.CCC2
            LIB.CCC3
        %end;
    ;

    %if &group = BBB %then
        %let byvarlist = customer descending type key var1 var2;
    %else
        %let byvarlist = customer key var1 var2;

    by &byvarlist.;


    if first.customer then do;
        <logic>
    end;

run;

%mend;

BY语句确实包含了我想要的新变量,但是现在我当然对组BBB中的每个数据集都收到以下SAS错误:

ERROR: BY variable type is not on input data set LIB.BBB1.

添加长度语句对错误没有影响,BBB数据集列表的顺序也没有(即MYDATA上方的BBB1等)。我的另一个想法是仅在%if ... %then逻辑中指定我的数据集,例如%if &dataset. = LIB.MYDATA %then ...,但我不确定如何进行操作以及它是否仍然有效。

是否有任何方法可以解决此问题,所以我的数据集可以在不更改其他数据集类型的情况下进行进一步排序?

1 个答案:

答案 0 :(得分:0)

没有测试代码,但是您可以尝试将设置的数据集保存到一个临时数据集中,然后使用带有更多变量的by语句。在使用

之前,还要对变量X给出的数据集X进行排序
%macro test(group=);
data X_TEMP;
    set
        %if group = AAA %then %do;
            LIB.AAA1
            LIB.AAA2
            LIB.AAA3
        %end;
        %else %if group = BBB %then %do;
            LIB.MYDATA
            LIB.BBB1
            LIB.BBB2
            LIB.BBB3
        %end;
        %else %if group = CCC %then %do;
            LIB.CCC1
            LIB.CCC2
            LIB.CCC3
        %end;
    ;
run;

%let byvarlist = customer descending type key var1 var2;

proc sort data=X_TEMP; by &byvarlist; 
run;

data X;
 set X_TEMP;
    by &byvarlist.;

    %if first.customer %then %do;
        <logic>
    %end;
run;
%mend;

现在X_TEMP将具有包括类型在内的所有变量(即使其他数据集为空)