BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
eabc0351
Quartz | Level 8

Hello. I have the following data:

data have;
input id day1 day2 day3 day4 otherd7;
datalines;
1 -11 -10 -9 -8 0
1 -7 -6 . . .
2 -20 -19 -18 -17 1
2 -16 . . . .
3 -8 -7 -6 -5 .
3 -4 . . . .
;
run;

 I would like the following data:

data want;
input id day1 day2 day3 day4 otherd7;
datalines;
1 -11 -10 -9 -8 0
1 -7 -6 -10 -9 0
2 -20 -19 -18 -17 1
2 -16 -19 -18 -17 1
3 -8 -7 -6 -5 .
3 -4 -7 -6 -5 .
;
run;

This is just a sample of the variables in the table. I would like to do this for every variable in the table. Each ID has 2 observations. Essentially, I would like to "fill down" if the value in last.id is missing. Could someone please help me with some code. I figured out how to do this for one variable at a time, but cannot figure out how to do it for all the variables in one easy step. Thank you.

1 ACCEPTED SOLUTION

Accepted Solutions
novinosrin
Tourmaline | Level 20
data have;
input id day1 day2 day3 day4 otherd7;
datalines;
1 -11 -10 -9 -8 0
1 -7 -6 . . .
2 -20 -19 -18 -17 1
2 -16 . . . .
3 -8 -7 -6 -5 .
3 -4 . . . .
;
run;

data want;
  update have(obs=0) have;
  by id;
  output;
run;

View solution in original post

5 REPLIES 5
eabc0351
Quartz | Level 8
Quick edit -- the first row is supposed to be:
1 -11 -10 -9 -8 0
1 -7 -6 -9 -8 0
novinosrin
Tourmaline | Level 20
data have;
input id day1 day2 day3 day4 otherd7;
datalines;
1 -11 -10 -9 -8 0
1 -7 -6 . . .
2 -20 -19 -18 -17 1
2 -16 . . . .
3 -8 -7 -6 -5 .
3 -4 . . . .
;
run;

data want;
  update have(obs=0) have;
  by id;
  output;
run;
eabc0351
Quartz | Level 8
Oh that was so easy. I tried it but had the code a little off. Thank you!
CurtisMackWSIPP
Lapis Lazuli | Level 10

Glad you made that correction, I was having trouble replicating it.  Here is a fairly elegant solution.

 

data mywant;
  set have;
  array toretain day1 day2 day3 day4 otherd7;
  by id;
  do over toretain;
    junk = lag(toretain);
    toretain = coalesce(toretain,junk);
  end;
  output;
  if last.id then do over toretain;
    toretain = .;
  end;
run;

Note that the real trick is setting junk = to the lag.  Lag only works if it is called every row.  If the lag was in the coalesce will not call it if the current row has a value.

eabc0351
Quartz | Level 8
Thank you @CurtisMackWSIPP, I will give that a try as well.

hackathon24-white-horiz.png

The 2025 SAS Hackathon has begun!

It's finally time to hack! Remember to visit the SAS Hacker's Hub regularly for news and updates.

Latest Updates

How to Concatenate Values

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.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 5 replies
  • 1510 views
  • 0 likes
  • 3 in conversation