SAS 宏命令 循环

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SAS 宏命令 循环相关的知识,希望对你有一定的参考价值。

这是我的宏命令cut(x,y,out),我想不断变化x(10-100, by 1),y(0.1-9, by 0.1),out(每一对x,y生成不同的out数据集),试了半天说循环不闭合,求高人给一个让下面这个宏不断对 x, y, out循环的SAS命令。奉上所有财富值,虽然不多……
%macro cut(x,y,out);
data abc2;
set sasuser.abc;
if risk>=&x then dag1=1; /*step1:risk score筛选结果*/
else dag1=2;
if fpg>=&y then dag2=1; /*step2:FPG筛选结果*/
else dag2=2;
if dag1=1 and dag2=1 then dag=1;
else dag=2;
if FPG>=7 or OGTT>=11.1 then WHO=1; /*按照WHO标准诊断结果*/
else WHO=2;
ods listing;
ods output Freq.Table1.CrossTabFreqs=out1;
proc freq;
tables dag*WHO;
run;
quit;
ods output close;
ods listing;
data out2;
set out1;
keep Frequency dag WHO ColPercent;
run;
data &out;
merge out2(where=(dag=1 and WHO=1) rename=(Frequency=n)) out2(where=(dag=2 and WHO=2) rename=(ColPercent=ColPercent2)) ;
youdex=ColPercent+ColPercent2-100;
s1=&x ;
s2=&y;
run;
%mend cut;

参考技术A 试试
%macro test;
%do x=10 %to 100 %by 1 ;
%do y=0.1 %to 9 %by 0.1;

%cut(&x.,&y.,out&x.);

%end;

%end;
%mend;

%test

SAS 宏循环使用单引号的多个“yyyy-mm-dd”日期格式

【中文标题】SAS 宏循环使用单引号的多个“yyyy-mm-dd”日期格式【英文标题】:SAS Macro looping through multiple 'yyyy-mm-dd' date format with single quotes 【发布时间】:2021-09-24 04:09:26 【问题描述】:

我需要在 SAS 宏中循环某些日期格式,例如“yyyy-mm-dd”,因为我的主要查询主体使用 Teradata SQL Pass-Thru,但是我下面的代码在 %let wk_first_dt 没有获取 'yyyy 的情况下不起作用-mm-dd' 格式。错误说

%MACRO DO_APPEND;
%let first_dt_list = '2020-03-11' '2020-03-18';
%local i wk_first_dt;
%do i=1 %to %sysfunc(countw(&first_dt_list));
%let wk_first_dt = %scan(&first_dt_list, &i);

...
proc sql
...

where BILL_DT >= Date &wk_first_dt
AND SL_INVC.BILL_DT <= (Date &wk_first_dt + 7)
...
quit;


...

%END;
%MEND; 
%DO_APPEND;
ERROR: Literal contains unmatched quote.
ERROR: The macro DO_APPEND will stop executing.

做了很多研究,我认为问题是由于这种格式的单引号“yyyy-mm-dd”,因为在 SAS 宏中对单引号进行了特殊处理。然而,最受欢迎的建议像

%let first_dt_list = %str(%')yyyy-mm-dd.%str(%') 

在我的情况下不起作用。请指出我正确的方向。提前致谢!

顺便说一句,在上面的代码中,如果我将 %scan(&first_dt_list, &i) 更改为 '2020-03-11',整个宏都可以工作 - 但我只需要循环多个日期。这让我相信一旦将 'yyyy-mm-dd' 传递给 %let wk_first_dt,问题就会得到解决。

【问题讨论】:

您是否打开了 MPRINT 选项,以便在 LOG 中看到您的宏正在生成的 SAS 代码? 【参考方案1】:

您的 %SCAN() 函数调用错误。

75    %let list = '2020-03-11' '2020-03-18';
76    %put %qscan(&list,1);
'2020

由于您没有告诉 %SCAN() 使用哪个分隔符,它使用了任何默认分隔符集,包括连字符。​​

试着告诉它只能使用空格作为分隔符。

%do i=1 %to %sysfunc(countw(&first_dt_list, %str( )));
%let wk_first_dt = %scan(&first_dt_list, &i,%str( ));

【讨论】:

以上是关于SAS 宏命令 循环的主要内容,如果未能解决你的问题,请参考以下文章

SAS 显示管理器:查看表命令

SAS中的宏变量开头和结尾分别是啥命令?

来自 VBscript 的带有空格的 Cmd 命令

sas如何写赋值循环

#SAS#月份循环

在 Oracle PL/SQL 中复制 SAS DO 循环