SAS: повысить эффективность массива с помощью макросов - PullRequest
0 голосов
/ 05 февраля 2019

В данный момент я пытаюсь попрактиковаться в макросах 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 Ответ

0 голосов
/ 05 февраля 2019

Вы смешиваете область действия, которая часто нежелательна.

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

Цикл %do сгенерирует исходный код для 2шаг данных if для каждой итерации макроса %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';
...