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';