全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1399 2
2016-07-26

data test;
input x y;
cards;
1  11
1 22
2 22
3 33
4 44
5 55
;
run;
%macro a1;
data test2;
set test;
where %if x=1 %then y<20;
%else y>20;;
run;
%mend;

%a1
结果test2里面只有test1中的后5条记录,只之执行了y>20的条件,没有根据x的取值来选择性的执行Y的条件,为什么?谢谢


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2016-7-26 20:10:22
因为 %if %then 是宏语句, 里面对应的条件应该是用宏变量来判定, 运行程序的时候, 先对宏语句进行编译, 这时候 还没开始读数据呢, 所以x=1这个条件是无法判定的.

如果仅针对这个语句的规则, 建议改为:
where (x=1 and y<20) or (x^=1 and y>20);
这样不使用宏语句.
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-7-26 23:23:10
同意楼上
在宏里,宏语句始终是比data step 语句先执行的,所以%if x=1 %then y <20 %else 始终是比set test 先执行的,此时x还没有赋值,所以执行的是%else 部分
data test;
input x y;
cards;
1  11
1 22
2 22
3 33
4 44
5 55
;
run;
%macro a1;
data test2;
set test;
where %if x=1 %then %str(y>20;);
%else %str(y< 20;); *这里换了个顺序;
run;i%mend;

%a1;

这样调整下,依然是%else 后的 y < 20 先执行
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群