Help using Base SAS procedures

Retain

Reply
Contributor
Posts: 73

Retain

I think I am doing something wrong with the retain statement.

I hope someone can guide me.

I have a table like this and I want to carry forward the last observed date

ID     date

1     01jan2013

1     .

1     .

1     12mar2013

1     .

1     .

2     07feb2013

2     .

2     .

2     25apr2013

2     .

2.     .

The result should look like this:

ID     date

1     01jan2013

1     01jan2013

1     01jan2013

1     12mar2013

1     12mar2013

1     12mar2013

2     07feb2013

2     07feb2013

2     07feb2013

2     25apr2013

2     25apr2013

2.     25apr2013

Thanks

Thomas

Respected Advisor
Posts: 3,777

Re: Retain

You could use the update trick.  Vertical coalesce.

data have;
   input ID  date :date.;
  
format date date9.;
  
cards;
1     01jan2013
1     .
1     .
1     12mar2013
1     .
1     .
2     07feb2013
2     .
2     .
2     25apr2013
2     .
2.     .
;;;;
   run;
data locf;
   update have(obs=0) have;
   by id;
   output;
  
run;
proc print;
  
run;

Obs    ID         date

 
1     1    01JAN2013
 
2     1    01JAN2013
 
3     1    01JAN2013
 
4     1    12MAR2013
 
5     1    12MAR2013
 
6     1    12MAR2013
 
7     2    07FEB2013
 
8     2    07FEB2013
 
9     2    07FEB2013
10     2    25APR2013
11     2    25APR2013
12     2    25APR2013
Contributor
Posts: 73

Re: Retain

Thanks!

Works fine!

Just curious, would it be possible to do the same operation with retain? Just trying to understand the retain statement

/Thomas

Super User
Super User
Posts: 7,392

Re: Retain

Hi,

data want (drop=lstdate);

  set have;

  retain lstdate;

  if date ne . then lstdate=date;

  else date=lstdate;

run;

Super User
Posts: 9,671

Re: Retain

data have;
   input ID  date :date.; 
   format date date9.; 
   cards; 
1     01jan2013
1     .
1     .
1     12mar2013
1     .
1     .
2     07feb2013
2     .
2     .
2     25apr2013
2     .
2.     .
;;;;
   run; 
data want(drop=d);
 set have(rename=(date=d));
 by id;
 retain date;
 if first.id or not missing(d) then date=d;
 format date date9.;
run;

Xia Keshan

Respected Advisor
Posts: 3,777

Re: Retain

bollibompa wrote:

Just curious, would it be possible to do the same operation with retain? Just trying to understand the retain statement

/Thomas

As you can see from the other replies it NOT possible to do Vertical Coalesce with retain. 

Ask a Question
Discussion stats
  • 5 replies
  • 262 views
  • 0 likes
  • 4 in conversation