Создайте переменную внутри оператора WHEN-DO SAS - PullRequest
0 голосов
/ 13 февраля 2020

Хотите создать 2 макропеременные "list" и "list2" в зависимости от значения prod, но оно всегда возвращает значения последней итерации.

Спасибо

%let prod=WC;
SELECT ;

  WHEN (WC = &prod)
    DO; 
        %let list = (60 , 63 ); 
        %let list2= ("6A","6B","6C") ;
    END;

  WHEN (MT = &prod)
    DO;
        %let list = (33 , 34);
        %let list2= ("3A","3B");
    END;

OTHERWISE;

END;

RUN;
``

Ответы [ 2 ]

2 голосов
/ 13 февраля 2020

Макропроцессор работает до того, как сгенерированный код передается в SAS для интерпретации. Таким образом, ваш код оценивается в следующем порядке:

%let prod=WC;
%let list = (60 , 63 ); 
%let list2= ("6A","6B","6C") ;
%let list = (33 , 34);
%let list2= ("3A","3B");
data ...
SELECT ;
  WHEN (WC = &prod) DO; 
  END;
  WHEN (MT = &prod) DO;
  END;
  OTHERWISE;
END;
...
RUN;

Чтобы установить макропеременные из шага текущих данных, используйте функцию CALL SYMPUTX (). Также вы действительно пытаетесь сравнить переменную W C с переменной MT? Есть ли в данных на вашем шаге данных эти переменные? Или вы хотели сравнить текст W C с текстом MT?

when ("WC" = "&prod") do;
  call symputx('list','(60,63)');
  call symputx('list2','("6A","6B","6C")') ;
end;
1 голос
/ 13 февраля 2020

Используйте call symput в шаге данных: -

Вызовите symput в документации SAS

Таким образом, ваши утверждения будут выглядеть примерно так: -

call symput("list", "(60 , 63 )");

Надеюсь, это поможет: -)

...