全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
903 7
2022-10-20

请教论坛里的大佬们,我想要创建一系列的新变量,拿创建其中一个新变量举例:

data abc_2;

set abc_1;

if PR99_2018 =1 and PR99_2019 =1 then PR99_1_2018=1;


if PR99_2018 =2 or PR99_2019 =2 then PR99_1_2018=2;

run;


根据以上式子,我创建了以下循环的码:

%MACRO DO_BRANCH;   

data abc_2;   

set abc_1;   

%DO I = 2015 %TO 2018;   

%DO Z = 2016 %TO 2019;   

if [url=]PR99_&I[/url] =1 and [url=]PR99_&Z[/url] =1 then [url=]PR99_1_&[/url]I=1;   

if PR99_&I =2 or PR99_&Z =2 then PR99_1_&I=2;   

run;  
%END;   

%END;   

%MEND [url=]DO_BRANCH;[/url]  

%DO_BRANCH;  

这个代码在Log出现了以下报错:

NOTE: Line generated by the invoked macro “DO_BRANCH”.

     5       if PR99_&I =1 and PR99_&Z =1 then PR99_1_&I=1;  if PR99_&I =2 or PR99_&Z =2 then PR99_1_&I=2;

            180

ERROR: 180-322: Statement is not valid or it is used out of propre order.

NOTE: Line generated by the invoked macro “DO_BRANCH”.

     5         if PR99_&I =2 or PR99_&Z =2 then PR99_1_&I=2;  if PR99_&I =2 or PR99_&Z =2 then PR99_1_&I=2;

                                                                                                     180

ERROR: 180-322: Statement is not valid or it is used out of propre order.

.

.

.

(以上报错一直重复到最后)


于是我又调整了一下:

%MACRO DO_BRANCH;   

%DO I = 2015 %TO 2018;   

%DO Z = 2016 %TO 2019;   

data abc_2;   

set abc_1;   

if PR99_&I =1 and PR99_&Z =1 then PR99_1_&I=1;   

if PR99_&I =2 or PR99_&Z =2 then PR99_1_&I=2;   

run;  
%END;   

%END;   

%MEND DO_BRANCH;  

%DO_BRANCH;  


倒是不报错了,但是在新的abc_2中的变量列表里只存在一个新变量PR99_1_2018,而且这个新变量只包含2一个值。我怀疑调换顺序后,每次循环的新变量会覆盖掉原来的变量。

所以想请问一下我这个循环的码存在什么问题?应该如何解决?或者有大佬知道有没有更好的方案写这个循环的?感谢!!!(出100论坛币跪求大佬解决ORZ)

二维码

扫码加我 拉你入群

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

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

全部回复
2022-10-20 11:03:08
不好意思各位,报错部分的下划线和180都是显示在If下面,第一段显示在第一个If,第二段显示在第二个If。
二维码

扫码加我 拉你入群

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

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

2022-10-22 22:49:37
通过别的方式解决了这个问题啦:

%MACRO DO_ABC;   
%DO I = 2015 %TO 2018;
%LET J=%EVAL(&I+1);
data ABC;
set ABC;
if PR99_&I = 1 and PR99_&J = 1 then PR99_1_&I = 1 ;
if PR99_&I = 2 or PR99_&J = 2 then PR99_1_&I = 2;
run;  
%END;
%MEND DO_ABC;  

%DO_ABC;
二维码

扫码加我 拉你入群

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

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

2022-10-30 11:47:01
第一个代码多了一个run,相当于do循环没有end就结束了,后面的两个end没起作用,删掉run就可以了。
第二个代码是data外面套了一个do循环,会在程序运行时产生了很多个data abc_2,但你没有output,所以只输出最后一次循环产生的数据集,按理说这样做是错的。
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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