Создание макрокодов 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;
Другие вопросы по тегам