2015-10-26 2 views
0

Я ищу некоторую помощь при создании макроса с использованием массива, а также операторов DO и IF для подмножества. В моей макрокоманде я пытаюсь просмотреть столбцы для переменных, и если переменная имеет конкретный код диагностики, то создайте новую переменную и отметьте как 1, а если не отметьте все остальные как 0, чтобы создать один новый набор данных, основанный на что новая переменная, сортировка этого набора данных и добавление его к другим наборам данных (поскольку набор входных данных разбивается ежеквартально), создавая таким образом один конечный набор данных, который я могу затем экспортировать (желательно в качестве вновь созданного ZIP-файла для хранения пространство вниз). Я использую SAS 9.4/Enterprise Guide 7.1.Вывод ZIP-данных

Код:

OPTIONS MERROR SERROR SOURCE MLOGIC SYMBOLGEN MINOPERATOR OBS=MAX; 
%MACRO DIAGXX(a,b); 
DATA NEW; 
    SET x.&a(KEEP= PATID DIAG1-DIAG5); 
    ARRAY &b{5} $ DIAG1-DIAG5; 
    DO I = 1 TO 5; 
     IF &b{I} IN ("1630" "1631" "1638" "1639") THEN MESO = 1; 
     ELSE MESO = 0; 
    END; 
    DROP I; 
RUN; 

PROC SORT DATA=NEW NODUPKEY; 
    BY PATID; 
    WHERE MESO=1; 
RUN; 

PROC APPEND BASE=ALLDATA1 DATA=NEW FORCE; 
RUN; 

PROC EXPORT 
     DATA=ALLDATA1 
     OUTFILE= "C:\x\x\DIAGNOSIS EXPORT\MACRO DIAGXX MESO.CSV" 
     REPLACE 
     DBMS=CSV; 
RUN; 
%MEND DIAGXX; 

%DIAGXX(Q1,MESTH); 
%DIAGXX(Q2,MESTH); 
+0

Возникает вопрос, как правильно искать по нескольким переменным и устанавливать один флаг «MESO», который будет истинным, если ЛЮБЫЕ из переменных содержат какие-либо коды? Если это так, удалите предложение 'ELSE' и вместо этого инициализируйте MESO до нуля до цикла DO. – Tom

ответ

0

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

MESO = 0; 
DO I = 1 TO 5; 
    IF &b{I} IN ("1630" "1631" "1638" "1639") THEN MESO = 1; 
END; 

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

DO I = 1 TO 5 WHILE (MESO=0); 
+0

Спасибо, Том. Очень признателен! –

Смежные вопросы