BookmarkSubscribeRSS Feed
☑ This topic is solved. Need further help from the community? Please sign in and ask a new question.
MM88
Calcite | Level 5

Hi community,

 

I am new to SAS, I would like to obtain a SAS dataset that completes intermediate lines.

 

I have a dataset like:

data original_data;
    input var1 $ var2;
    datalines;
A 12
B 15
C 20
D 23
;
run;

I would like to obtain another dataset with the intermediate lines like:

 

data original_data;
    input var1 $ var2;
    datalines;
A 12
A 13
A 14
B 15
B 16
B 17
B 18
B 19
C 20
C 21
C 22
D 23
;
run;

Thanks for your help.

1 ACCEPTED SOLUTION

Accepted Solutions
Tom
Super User Tom
Super User

If would be easier if you reversed the order because it is easier to REMEMBER something than PREDICT the future.

data original_data;
    input var1 $ var2;
datalines;
A 12
B 15
C 20
D 23
;

proc sort data=original_data out=want;
  by descending var2;
run;

data want;
  set want;
  by descending var2;
  do var2=var2 to max(var2,lag(var2)-1);
    output;
  end;
run;

proc sort data=want;
  by var2;
run;

proc print;
run;

The LAG() function let's you remember the value it was last passed.

 

Looking into the future is harder.  Here is one way:

data want;
  set original_data;
  set original_data(keep=var2 rename=(var2=next_var2) firstobs=2) original_data(drop=_all_ obs=1);
  do var2=var2 to max(var2,next_var2-1);
    output;
  end;
  drop next_var2;
run;

 

View solution in original post

3 REPLIES 3
Tom
Super User Tom
Super User

If would be easier if you reversed the order because it is easier to REMEMBER something than PREDICT the future.

data original_data;
    input var1 $ var2;
datalines;
A 12
B 15
C 20
D 23
;

proc sort data=original_data out=want;
  by descending var2;
run;

data want;
  set want;
  by descending var2;
  do var2=var2 to max(var2,lag(var2)-1);
    output;
  end;
run;

proc sort data=want;
  by var2;
run;

proc print;
run;

The LAG() function let's you remember the value it was last passed.

 

Looking into the future is harder.  Here is one way:

data want;
  set original_data;
  set original_data(keep=var2 rename=(var2=next_var2) firstobs=2) original_data(drop=_all_ obs=1);
  do var2=var2 to max(var2,next_var2-1);
    output;
  end;
  drop next_var2;
run;

 

MM88
Calcite | Level 5
Thanks @Tom . It works good. I appreciate your help.
sbxkoenk
SAS Super FREQ
data original_data;
    input var1 $ var2;
    datalines;
A 12
B 15
C 20
D 23
;
run;

data have;
 merge original_data 
       original_data(firstobs=2 
                     rename=(var1=var1accent var2=var2accent));
run;

data want(drop=var1accent var2: rename=(i=var2));
 set have end=last;
 if var2accent NE . then do;
   do i=var2 to (var2accent-1);
    output;
   end;
 end;
 if last then do; i=var2; output; end;
run;
/* end of program */

Koen

 

SAS Innovate 2025: Call for Content

Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 16. Read more here about why you should contribute and what is in it for you!

Submit your idea!

SAS Enterprise Guide vs. SAS Studio

What’s the difference between SAS Enterprise Guide and SAS Studio? How are they similar? Just ask SAS’ Danny Modlin.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 3 replies
  • 432 views
  • 0 likes
  • 3 in conversation