2013-12-14 3 views
0
proc sql noprint; 
    select count(distinct USUBJID) into : N1 - : N4 from DM where upcase(ARM) ^= "SCREEN FAILURE"` 
    group by ARMN; 
quit; 

%macro TOTAL(name=,num=); 
    %do i=1 %to #`  
    %if ARMN=&i %then TOTAL= put(COUNT,3.)||" (" ||right(put(COUNT*100/&&name&num,5.1))||"%) "; 
%end;  
%mend TOTAL;  

data TOTAL;  
    set DS;  
    %TOTAL(name=T,num=4); 
    /*if ARMN=1 then TOTAL= put(COUNT,3.)||" (" ||right(put(COUNT*100/&N1,5.1))||"%) ";*/  
run; 

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

+0

Похоже, проблема с этим утверждением в вашем макроопределения: %, если ARMN = & я%, то ... макрокоманды компилировать до открытого кода делает, поэтому, когда% ИТОГО компилирует это ничего не знает о вашей переменной ARMN, который будет выполняться на шаге данных. –

+0

@DmitryShopin, вы должны ответить на свой вопрос, я думаю, что это основная проблема. –

+0

Это должно быть datastep 'if', а не макрос% IF. 'если ARMN = & i, то TOTAL =' –

ответ

2

Я думаю, что ваш вопрос на самом высоком уровне - это то, что @DmitryShopin упоминает в своем комментарии. Тем не менее, мой ответ может заключаться в том, что останавливает макрос в разрешении.

Ваш% If% Then оператор в макросе% Total нуждается в другой полуколонии в конце. Одна полуколония для оператора присваивания переменных и одна точка с запятой для оператора% If% Then. Если вы создаете более одного оператора присваивания переменной, каждому из них требуется конечная точка с запятой.

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

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