SAS: Как получить значение из таблицы на основе значения из другой переменной и назначить макропеременной?

#sas #sas-macro

Вопрос:

У меня есть набор данных, который связан с изменениями статуса. Из этой таблицы я затем создал таблицу PROC FREQ, которая подсчитывает количество появлений определенного статуса, и я вывел ее в рабочий файл. Ниже показано, как выглядит выводимая таблица PROC FREQ:

Статус считать процент
Успешный 500 0.8
Неудачный 100 0.16
Неизвестный 25 0.04

Глядя на выведенную таблицу PROC FREQ, где статус равен «Успешно», я хочу взять соответствующее ПРОЦЕНТНОЕ значение и присвоить его макропеременной, чтобы я мог ссылаться на это значение позже.

Я немного читал о процедурах SYMGET/SYMPUT, хотя знаю недостаточно, чтобы знать, подходят ли они.

Я намерен использовать это значение макропеременной в макрофункции, если макропеременная превышает определенное значение, а затем выполнить некоторый дополнительный код.

 %macro condition;  %if amp;pctval gt;0.5 %then %do;  Procedure ………  %else %do;  Procedure ……  run;  %end;  

Комментарии:

1. Покажите, как вы планируете ссылаться на это значение позже. Есть много соображений. SYMPUT создаст текстовое представление процента, но численная интерпретация этого не будет идентична вычисленному проценту. Вы также можете использовать пользовательский формат или объединить транспонирование таблицы freq.

2. Эй, @Ричард, я планирую использовать эту макропеременную в рамках некоторой логики if в макрофункции на более позднем этапе моей программы. Если значение процента превышает определенную точку, выполните некоторый дополнительный код.

Ответ №1:

Выведите результаты процедуры FREQ в таблицу и используйте процедуру SQL, чтобы сохранить их в макропеременной для последующего использования.

 data have; format status $20.; do i=1 to 500;  status="Successful";  output; end; do i=501 to 600;  status="Unsuccessful";  output; end; do i=601 to 625;  status="Unknown";  output; end; drop i; run;  proc freq data=have noprint; table status / out=want TOTPCT list; quit;  proc sql noprint; select percent/100 into :successpct from want where status = "Successful"; quit;  %macro do_smth(treshold);  %if %sysevalf(amp;successpct. gt; amp;treshold.) %then %do;  %put "Success percentage above amp;treshold. treshold";  /* ... do smth ... */  %end;  %else %do;  %put "Success percentage below amp;treshold. treshold";  /* ... do smth else ... */  %end; %mend;  %do_smth(0.79);  Output: "Success percentage above 0.79 treshold"  

Ответ №2:

Если вы хотите выполнить макрос состояния для нескольких состояний:

(1) Выведите частоту вашего процесса в таблицу, используя /out=частота.

(2) Используйте proc sql, чтобы получить значения состояния и процента в макропеременную.

(3) Выполните свой макрос условий для каждого значения статуса, используя %let, чтобы получить название статуса, в котором мы находимся, и значение процента для него.

 /* (1) */ proc freq data=have;  tables status /out=freq; run;  /* (2) */ proc sql;  select  count(*)  ,Status  ,PERCENT  into  :num_status  ,:status_list separated by "|"  ,:percent_list separated by "|"  from freq (where=(Status="Successful")); quit;  /* (3) */ %macro condition;   %do i=1 %to num_status;  %let status = %scan(%str(amp;status_list.),amp;i.,%str(|),m);  %let pctval = %scan(%str(amp;percent_list.),amp;i.,%str(|),m);    %if amp;pctval gt;0.5 %then %do;    Procedure ………    %else %do;    Procedure ……    %end;    %end; %mend;  

Дайте мне знать, если вам понадобится что-то другое.

Ответ №3:

Если вы просто хотите выполнить свой макрос условий для «Успешного»:

(1) Выведите частоту вашего процесса в таблицу, используя /out=частота.

(2) Используйте proc sql, чтобы ввести значение процента в макропеременную.

(3) Выполните макрос состояния.

 /* (1) */ proc freq data=have;  tables status /out=freq; run;  /* (2) */ proc sql;  select  PERCENT/100 into: pctval  from freq (where=(status = "Successful")); quit;  /* (3) */ %macro condition;   %if amp;pctval gt;0.5 %then %do;    Procedure ………    %else %do;    Procedure ……    %end; %mend;  

Ответ №4:

Если все, что вас интересует, — это % успеха, запишите это число непосредственно в SQL-запросе в макропеременную. Предпочтительнее меньшее количество проходов данных.

 proc sql noprint;  select sum(status='Successful')/count(*) into :pct_successful  from have; quit;  %put amp;pct_successful.;  

Затем вы можете использовать его по желанию позже для дальнейшей обработки.