Hello
User define base month in a structure of YYMM (Macro variable).
Then I want to create automatically 6 macro variables called: Back0,Back1,Back2,Back3,Back4,Back5 which are 0/1/2/3/4/5 months previous months of base month.
I also want to create automatically 6 macro variables called: month6,month5,month4,month3,month2,month1 which are equal to macro variables Back0,Back1,Back2,Back3,Back4,Back5 (month6 eual to Back0,month5 equal to Back1 and so on).
What is the way to solve the problem with statement k-1?
I know that I can do it in the following way
%let month6=&back0;
%let month5=&back1;
%let month4=&back2;
%let month3=&back3;
%let month2=&back4;
%let month1=&back5;
But I want to understand what is the problem with k-1 statement and how to solve it?
%let baseMon=1811;
data tbl;
EndMon = intnx('month',input("&baseMon",yymmn4.),0,'b');/*initial start date*/
startMon = intnx('month',input("&baseMon",yymmn4.),-5,'b');/*End date*/
length YYMM $4;
j=0;
k=6;
do until (startMon > EndMon);
YYMM = put(EndMon,yymmn4.);
back=cats('back',j);
month=cats('month',k);
call symputx(cats('back',j),YYMM);
call symputx(cats('month',k),YYMM);
output;
j+1;
k-1;/*Here is the problem. When I write k+1 it works but I need k-1 for my purpose*/
EndMon = intnx('month',EndMon,-1,'b');
end;
keep YYMM back month;
run;
/**Results that I want to get are:**/
%put &back0;/*1811*/
%put &back1;/*1810*/
%put &back2;/*1809*/
%put &back3;/*1808*/
%put &back4;/*1807*/
%put &back5;/*1806*/
%put &month6;/*1811*/
%put &month5;/*1810*/
%put &month4;/*1809*/
%put &month3;/*1808*/
%put &month2;/*1807*/
%put &month1;/*1806*/
@Ronein wrote:
Hello
User define base month in a structure of YYMM (Macro variable).
Then I want to create automatically 6 macro variables called: Back0,Back1,Back2,Back3,Back4,Back5 which are 0/1/2/3/4/5 months previous months of base month.
I also want to create automatically 6 macro variables called: month6,month5,month4,month3,month2,month1 which are equal to macro variables Back0,Back1,Back2,Back3,Back4,Back5 (month6 eual to Back0,month5 equal to Back1 and so on).
What is the way to solve the problem with statement k-1?
I know that I can do it in the following way
%let month6=&back0;
%let month5=&back1;
%let month4=&back2;
%let month3=&back3;
%let month2=&back4;
%let month1=&back5;But I want to understand what is the problem with k-1 statement and how to solve it?
k-1;/*Here is the problem. When I write k+1 it works but I need k-1 for my purpose*/
The problem is that the statement
k+1;
is a summing statement. Which means that (1) missing k will be treated as a zero, and (2) k will be retained over iterations of the data step. Since you are doing iterations over a do loop, instead of over multiple data set iterations, you could just as well do k=sum(k,1).
But
k-1;
is NOT such a statement. But you could do
k=sum(k,-1);
Or if you like the summing statement format you could do
k+(-1);
@Ronein wrote:
Hello
User define base month in a structure of YYMM (Macro variable).
Then I want to create automatically 6 macro variables called: Back0,Back1,Back2,Back3,Back4,Back5 which are 0/1/2/3/4/5 months previous months of base month.
I also want to create automatically 6 macro variables called: month6,month5,month4,month3,month2,month1 which are equal to macro variables Back0,Back1,Back2,Back3,Back4,Back5 (month6 eual to Back0,month5 equal to Back1 and so on).
What is the way to solve the problem with statement k-1?
I know that I can do it in the following way
%let month6=&back0;
%let month5=&back1;
%let month4=&back2;
%let month3=&back3;
%let month2=&back4;
%let month1=&back5;But I want to understand what is the problem with k-1 statement and how to solve it?
k-1;/*Here is the problem. When I write k+1 it works but I need k-1 for my purpose*/
The problem is that the statement
k+1;
is a summing statement. Which means that (1) missing k will be treated as a zero, and (2) k will be retained over iterations of the data step. Since you are doing iterations over a do loop, instead of over multiple data set iterations, you could just as well do k=sum(k,1).
But
k-1;
is NOT such a statement. But you could do
k=sum(k,-1);
Or if you like the summing statement format you could do
k+(-1);
Too complicated, build the inversion with a simple subtraction:
%let baseMon=201811;
%let number=6;
data _null_;
do i = 0 to &number.;
em = put(intnx('month',input("&basemon.",yymmn6.),-i,'b'),yymmn6.);
call symputx(cats('back',i),em);
call symputx(cats('month',&number. - i),em);
end;
run;
SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.