Объединение наборов данных SAS, но с сохранением порядка одного набора данных - PullRequest
0 голосов
/ 02 мая 2019

Я хочу добавить макрос, который используется как часть стандартного процесса.Макрос в настоящее время объединяет несколько наборов данных из разных групп продуктов, как показано ниже:

%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;

Я пытаюсь достичь, вставив свой собственный набор данных и сохранив его порядок для удовлетворения нового требования.Я также должен сделать это, изменяя как можно меньше стандартного макроса, описанного выше, чтобы не влиять на остальные данные и последующие процессы.

В отдельной программе, запускаемой перед этим макросом, яЯ отсортировал набор данных с дополнительной переменной в диапазоне от customer до key.Если я просто отсортирую по переменным, указанным выше, мой набор данных будет в неправильном порядке, что даст неправильные 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 включает новую переменную, которую я хочу, но теперь, конечно, я получаю следующую ошибку SAS для каждого набора данных в группе BBB:

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

Добавление оператора длины hasnЭто не имеет значения для ошибки, также как и порядок списка BBB наборов данных (то есть с MYDATA выше BBB1 и т. д.).Другая идея, которая у меня была, заключалась в том, чтобы указать мой набор данных только в логике %if ... %then, например %if &dataset. = LIB.MYDATA %then ..., но я не уверен, как это сделать и будет ли он работать.

Есть ли какие-либоспособ обойти эту проблему, чтобы мой набор данных можно было сортировать дальше, не меняя вид других наборов данных?

1 Ответ

0 голосов
/ 02 мая 2019

Не тестировал код, но вы можете попробовать сохранить набор данных во временный, а затем использовать оператор by с большим количеством переменных.Также перед использованием

%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 с заданными переменными. Теперь в X_TEMP будут все переменные, включая тип (даже если для других наборов данных он пуст)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...