Объединение наборов данных, только если они существуют - PullRequest
0 голосов
/ 18 июня 2019

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

На самом деле ничего не пробовал, но то, что я пытаюсь сделать, можно увидеть ниже.

DATA Something;
    MERGE Something SomethingElse AnotherThing EXIST(YetAnotherThing)*YetAnotherThing;
RUN;

Ну, очевидно, это не работает, потому что SAS не работает так, но я пытаюсь сделать что-то подобное, где YetAnotherThing - один из наборов данных, которые я тестирую, чтобы увидеть, существует ли он и объединиться Что-то, если это так.

Ответы [ 3 ]

2 голосов
/ 18 июня 2019

Если у вас есть систематическое соглашение об именах, это может быть упрощено.Например, если у вас есть общий префикс, он становится:

data want;
merge prefix: ;
run;

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

1 голос
/ 18 июня 2019

Что-то вроде этого:

data test1;
do i = 1 to 10;
    val1 = i;
    output;
end;
run;

data test2;
do i = 1 to 10;
    val2 = i*2;
    output;
end;
run;

data test3;
do i = 1 to 10;
    val3 = i*3;
    output;
end;
run;

data test5;
do i = 1 to 10;
    val5 = i*4;
    output;
end;
run;



%macro multi_merge(varlist);
%local j;
data test_merge;
set %scan(&varlist,1);
run;
%put %sysfunc(countw(&varlist));
%if  %sysfunc(countw(&varlist)) > 1 %then %do;
    %do j = 2 %to %sysfunc(countw(&varlist));
        %if %sysfunc(exist(%scan(&varlist,&j))) %then %do;
            data test_merge;
            merge test_merge %scan(&varlist,&j);
            by i;
            run;
        %end;
    %end;
%end;
%mend;

%multi_merge(test1 test2 test3 test4 test5);

Test4 не существует.

То же самое без цикла:

если вы не хотите зацикливаться, выможно сделать это:

%macro if_exists(varlist);
%if %sysfunc(exist(%scan(&varlist,1))) %then %scan(&varlist,1);
%mend;

data test_merge2;
merge test1
%if_exists(test2)
%if_exists(test3)
%if_exists(test4)
%if_exists(test5)
%if_exists(test6);
by i;
run;
0 голосов
/ 18 июня 2019

Я могу придумать два варианта:

  1. Перебрать список входных наборов данных, проверить, существует ли каждый из них, а затем объединить только те, которые есть.
  2. В начале вашего макроса, прежде чем вы условно создадите каждый из потенциальных входных наборов данных, создайте фиктивный набор данных с тем же именем, не содержащий строк или столбцов. Затем, когда вы попытаетесь объединить их, они всегда будут существовать, не путая вывод с большим количеством пропущенных значений.

Пример кода для создания пустого набора данных:

data want;
stop;
run;
...