Создание макрокодов SAS
Я хотел бы создать несколько флагов в моем наборе данных (и многие производные числовые характеристики), но я изо всех сил пытаюсь заставить код работать.
Я использую итеративный цикл с условиями. Любая помощь или предложения по резолюциям будет принята с благодарностью.
Вот код, который я пробовал, который создает флаг, но это не переменная в моем новом наборе данных.
%macro gb1(howmany);
%do i=1 %to &howmany;
%if status&i = 1 %then %let &gb1_&i = 1;
%else %if status&i = 2 %then %let &gb1_&i = 1;
%else %if dpd&i >= 2 %then %let &gb1_&i = 1;
%else %if ((dpd&i < 2) and (dpd&i >= 1)) %then %let &gb1_&i = 2;
%else %let &gb1_&i = 1;
%end;
%mend gb1;
data test;
set y2014.perf_data_derive (where=((dpd15 <= 2) and (prod = 1)));;
%gb1(36);
run;
Я ценю любую помощь, которую я могу получить, заранее спасибо.
2 ответа
%if
, %then
, %else
и т.д. - это операторы макросов, которые используются для оценки выражений с помощью макропеременных с целью условной отправки фрагментов кода SAS. Похоже, вы не пытаетесь сделать что-либо из этого; Вы хотите просто повторить операторы шага данных, которые включают переменные в вашем наборе данных (не макропеременные). Чтобы сделать это, используйте операторы так же, как и в шаге данных:
%macro gb1(howmany);
%do i=1 %to &howmany;
if status&i = 1 then gb1_&i = 1;
else if status&i = 2 then gb1_&i = 1;
else if dpd&i >= 2 then gb1_&i = 1;
else if ((dpd&i < 2) and (dpd&i >= 1)) then gb1_&i = 2;
else let gb1_&i = 1;
%end;
%mend gb1;
Я думаю, что вы не уверены в макроязыке. Он используется (как правило) для генерации кода SAS. По сути, это спасает вас от набора текста. Он ничего не делает с переменными шага DATA. Код шага DATA позволяет вам манипулировать переменными шага данных, язык макросов работает с макропеременными.
Есть ли в вашем входном наборе данных perf_data_derive переменные, такие как status1 status2 ... status36 и dpd1 dpd2 ... dpd36? И вы пытаетесь создать новые переменные gb1_1 gb1_2 ... gb1_36? Если это так, вы должны посмотреть, как использовать массивы. Оператор ARRAY - это оператор шага DATA, который позволяет ссылаться на переменные шага данных. Вы можете написать что-то вроде (не проверено):
data test;
set y2014.perf_data_derive (where=((dpd15 <= 2) and (prod = 1)));
array status{36} ; *array elements status1-status36;
array dpd{36} ;
array gb1_{36} ; *array statement can create new variables! ;
do i=1 to 36;
if status{i}=1 then gb1_{i} = 1;
else if status{i}=2 then gb1_{i} = 1;
else if dpd{i} >=2 then gb1_{i} = 1;
*etc;
end;
drop i;
run;