SAS: повысить эффективность массива с помощью макросов

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

Вот мой оригинальный базовый код массива:

data dataset_new;    
    set dataset_old;
    array array_one{12} value01-value12;
    do i = 1 to 12;  
        if array_one{i} = '121' then sponsor = 'yes';
        if array_one{i} in ('44', '55')  then participant = 'active';
    end;         
run;        

И вот моя неудачная попытка добавить макросы в это.

%let maximum = 10;   
%MACRO SPORTS(START,maximum);
data dataset_new;    
    set dataset_old;
    array array_one{12} value01-value12;
    %DO i = &START %TO &maximum ;
        if array_one{i} = '121' then sponsor = 'yes';
        if array_one{i} in ('44', '55')  then participant = 'active';
    %END;        
%MEND SPORTS;        
run;        

Спасибо за любые мысли о том, как это сделать.

1 ответ

Решение

Вы смешиваете сферу, что часто нежелательно.

Какое так называемое улучшение вы хотите?

%do цикл будет генерировать исходный код для 2 шага данных, если операторы для каждой итерации макроса %do,

Глобальный maximum назначение вне макроса ничего не делает в отношении установки или переопределения maximum что вызов макроса должен проходить. Макрос SPORTS должен вызываться для чего-либо, иначе вы просто компилируете макрос. Определение макроса также странным образом чередуется с run; вне определения макроса. В нежной, ты все делаешь неправильно.

Макрос генерирует исходный код и, таким образом, не может изменить исходный код работающего (и, следовательно, уже скомпилированного шага данных)

На теоретическом минимуме, вы можете захотеть

if array_one{&i} = '121' then sponsor = 'yes';

вместо

 if array_one{i} = '121' then sponsor = 'yes';

но это действительно не помогает в более широком смысле.

Вы на самом деле пытаетесь оценить разницу между

do i = 1 to 12;  
    if array_one{i} = '121' then sponsor = 'yes';
    if array_one{i} in ('44', '55')  then participant = 'active';
end;

и макрос сгенерированный источник

    if value01 = '121' then sponsor = 'yes';
    if value01 in ('44', '55')  then participant = 'active';
    if value02 = '121' then sponsor = 'yes';
    if value02 in ('44', '55')  then participant = 'active';
    if value03 = '121' then sponsor = 'yes';
    if value03 in ('44', '55')  then participant = 'active';
    if value04 = '121' then sponsor = 'yes';
    if value04 in ('44', '55')  then participant = 'active';
    if value05 = '121' then sponsor = 'yes';
    if value05 in ('44', '55')  then participant = 'active';
    if value06 = '121' then sponsor = 'yes';
    if value06 in ('44', '55')  then participant = 'active';
    if value07 = '121' then sponsor = 'yes';
    if value07 in ('44', '55')  then participant = 'active';
    if value08 = '121' then sponsor = 'yes';
    if value08 in ('44', '55')  then participant = 'active';
    if value09 = '121' then sponsor = 'yes';
    if value09 in ('44', '55')  then participant = 'active';
    if value10 = '121' then sponsor = 'yes';
    if value10 in ('44', '55')  then participant = 'active';
    if value11 = '121' then sponsor = 'yes';
    if value11 in ('44', '55')  then participant = 'active';
    if value12 = '121' then sponsor = 'yes';
    if value12 in ('44', '55')  then participant = 'active';
Другие вопросы по тегам