BookmarkSubscribeRSS Feed
abraham1
Obsidian | Level 7

Hi,

From below dataset, I want to populate previous date for unique subjid. I use below sas code but it is not working. can you please help me.

I need to populate

1) prev_date as separate column

2)A flag1 column that populate 1 when difference between first visit date and last visit date >25.

2)A flag2 column that populate 1 when difference between first visit and previous visit date >25.

 

data demon;
    input subjid $ visitdate : yymmdd10.;
    format visitdate yymmdd10.;
    datalines;
111 2024-07-15
111 2024-07-22
111 2024-08-29
222 2024-07-15
222 2024-07-22
333 2024-07-24
333 2024-08-15
333 2024-09-25

;
run;
proc sort data=demon;by subjid visitdate;run;
data demo1;
    set demon;
    by subjid visitdate;
    retain prev_date;
    
    if first.subjid then do;
        prev_date = .; 
    end;
    else prev_date = lag(visitdate);  
    
    format prev_date yymmdd10.;
run;

 

4 REPLIES 4
rudfaden
Lapis Lazuli | Level 10

You do not lag the first obs.

Try this:

data demon;
    input subjid $ visitdate : yymmdd10.;
    format visitdate yymmdd10.;
    datalines;
111 2024-07-15
111 2024-07-22
111 2024-08-29
222 2024-07-15
222 2024-07-22
333 2024-07-24
333 2024-08-15
333 2024-09-25

;
run;
proc sort data=demon;by subjid visitdate;run;
data demo1;
    set demon;
    by subjid visitdate;
    retain prev_date;

    prev_date = lag(visitdate);

    if first.subjid then do;
        prev_date = .; 
    end;
      
    
    format prev_date yymmdd10.;
run;
rudfaden
Lapis Lazuli | Level 10

If you want the flags, you can do this

data demon;
    input subjid $ visitdate : yymmdd10.;
    format visitdate yymmdd10.;
    datalines;
111 2024-07-15
111 2024-07-22
111 2024-08-29
222 2024-07-15
222 2024-07-22
333 2024-07-24
333 2024-08-15
333 2024-09-25

;
run;
proc sort data=demon;by subjid visitdate;run;
data demo1;
    set demon;
    by subjid visitdate;
    retain prev_date;

    
    if first.subjid then do;
        prev_date = visitdate;
    end;

    if not first.id then do;
        if visitdate-lag(visitdate)>25 then flag2=1;;
    end;

    if last.subjid then do;
        if visitdate-prev_date>25 then flag1=1;
    end;
    

    format prev_date yymmdd10.;
run;

hackathon24-white-horiz.png

2025 SAS Hackathon: There is still time!

Good news: We've extended SAS Hackathon registration until Sept. 12, so you still have time to be part of our biggest event yet – our five-year anniversary!

Register Now

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
  • 4 replies
  • 964 views
  • 4 likes
  • 3 in conversation