DATA Step, Macro, Functions and more

How to assign baseline flag to all OBS containing equal values of the sort order

Reply
Super Contributor
Posts: 272

How to assign baseline flag to all OBS containing equal values of the sort order

 

Dear,

 

I need assign base line flag based on a sort order. In my data, for some subjects have equal sort order values. My code assigning flag to only last OBS. I need to assign to all last OBS with EQUAL values. Please help in my code.

 

For ID=2 need to have flags for the last two OBS because subject has equal pid

 

my code;

 

proc sort data=data1;

by id test date pid;

run;

 

data dat2;

data1;

by id test date pid;

if last.test then flag = 'y';

run;

 

data

id       test            date                            pid                               treatment date

1        dbp          2015-04-06                    1                                 2015-04-07

1        dbp          2015-04-06                    2                                 2015-04-07

1        dbp          2015-04-06                    3                                 2015-04-07

2        dbp          2015-04-06                    1                                 2015-04-07

2        dbp          2015-04-06                    2                                 2015-04-07

2        dbp          2015-04-06                    2                                 2015-04-07

 

output need;

id       test            date                            pid                               treatment date                      flag

1        dbp          2015-04-06                    1                                 2015-04-07

1        dbp          2015-04-06                    2                                 2015-04-07

1        dbp          2015-04-06                    3                                 2015-04-07                             y

2        dbp          2015-04-06                    1                                 2015-04-07

2        dbp          2015-04-06                    2                                 2015-04-07                             y

2        dbp          2015-04-06                    2                                 2015-04-07                              y

 

 

 

output getting;

d       test            date                            pid                               treatment date                      flag

1        dbp          2015-04-06                    1                                 2015-04-07

1        dbp          2015-04-06                    2                                 2015-04-07

1        dbp          2015-04-06                    3                                 2015-04-07                             y

2        dbp          2015-04-06                    1                                 2015-04-07

2        dbp          2015-04-06                    2                                 2015-04-07                             

2        dbp          2015-04-06                    2                                 2015-04-07                              y

 

 

 

 

PROC Star
Posts: 7,467

Re: How to assign baseline flag to all OBS containing equal values of the sort order

Posted in reply to knveraraju91

One way would be to sort the data in reverse order. e.g.:

 

data have;
  informat date treatment_date anydtdte10.;
  input id test $ date pid treatment_date;
  cards;
1 dbp 2015-04-06 1 2015-04-07
1 dbp 2015-04-06 2 2015-04-07
1 dbp 2015-04-06 3 2015-04-07
2 dbp 2015-04-06 1 2015-04-07
2 dbp 2015-04-06 2 2015-04-07
2 dbp 2015-04-06 2 2015-04-07
;

 

proc sort data=have;
  by id test descending date descending pid;
run;

 

data want;
  set have;
  by id test date;
  if first.test or not first.test and pid eq lag(pid) then flag = 'y';
run;

 

proc sort data=want;
  by id test date pid;
run;

 

HTH,

Art, CEO, AnalystFinder.com

 

Super Contributor
Posts: 272

Re: How to assign baseline flag to all OBS containing equal values of the sort order

Dear,

 

Thanks for the help. I am not getting exactly the output I need.

 

With your code I am also flagging for the second OBS for ID=2.

 

data

data

id       test            date                            pid                               treatment date

1        dbp          2015-04-06                    1                                 2015-04-07

1        dbp          2015-04-06                    2                                 2015-04-07

1        dbp          2015-04-06                    3                                 2015-04-07

2        dbp          2015-04-06                    1                                 2015-04-07

2        dbp          2015-04-06                    1                                 2015-04-07

2        dbp          2015-04-06                    2                                 2015-04-07

2        dbp          2015-04-06                    2                                 2015-04-07

 

output need;

id       test            date                            pid                               treatment date                      flag

1        dbp          2015-04-06                    1                                 2015-04-07

1        dbp          2015-04-06                    2                                 2015-04-07

1        dbp          2015-04-06                    3                                 2015-04-07                             y

2        dbp          2015-04-06                    1                                 2015-04-07

2        dbp          2015-04-06                    1                                 2015-04-07

2        dbp          2015-04-06                    2                                 2015-04-07                             y

2        dbp          2015-04-06                    2                                 2015-04-07                              y

 

 

 

output getting;

d       test            date                            pid                               treatment date                      flag

1        dbp          2015-04-06                    1                                 2015-04-07

1        dbp          2015-04-06                    2                                 2015-04-07

1        dbp          2015-04-06                    3                                 2015-04-07                             y

2        dbp          2015-04-06                    1                                 2015-04-07

2        dbp          2015-04-06                    1                                 2015-04-07                            y

2        dbp          2015-04-06                    2                                 2015-04-07                            y                         

2        dbp          2015-04-06                    2                                 2015-04-07                            y

 

 

 

PROC Star
Posts: 7,467

Re: How to assign baseline flag to all OBS containing equal values of the sort order

Posted in reply to knveraraju91

I expanded your dataset and added an extra condition to the code. Does the following do what you want/need?

 

data have;
  informat date treatment_date anydtdte10.;
  input id test $ date pid treatment_date;
  cards;
1 dbp 2015-04-06 1 2015-04-07
1 dbp 2015-04-06 2 2015-04-07
1 dbp 2015-04-06 3 2015-04-07
2 dbp 2015-04-06 1 2015-04-07
2 dbp 2015-04-06 1 2015-04-07
2 dbp 2015-04-06 2 2015-04-07
2 dbp 2015-04-06 2 2015-04-07
1 xbp 2015-04-06 1 2015-04-07
1 xbp 2015-04-06 2 2015-04-07
1 xbp 2015-04-06 3 2015-04-07
2 xbp 2015-04-06 1 2015-04-07
2 xbp 2015-04-06 1 2015-04-07
2 xbp 2015-04-06 2 2015-04-07
2 xbp 2015-04-06 2 2015-04-07
;

proc sort data=have;
  by id test descending date descending pid;
run;

data want (drop=last_Smiley Happy;
  set have;
  by id test date;
  if first.test then flag = 'y';
  last_flag=lag(flag);
  last_pid=lag(pid);
  if not first.test and last_flag eq 'y' and pid eq last_pid then flag='y';
run;

proc sort data=want;
  by id test date pid flag;
run;

 

Art, CEO, AnalystFinder.com

Super Contributor
Posts: 272

Re: How to assign baseline flag to all OBS containing equal values of the sort order

Dear,

 

Thanks again. But I am getting the output I need for OBS where only two OBS with equal pid values present

 

But when there are 3 OBS with equal PID, your code only flagging only two OBS.

 

For the ID=2, the three OBS with pid=2 should have flagged. By using your code I am getting the output with only for two OBS. Thanks. 

 

example;

data

data

id       test            date                            pid                               treatment date

1        dbp          2015-04-06                    1                                 2015-04-07

1        dbp          2015-04-06                    2                                 2015-04-07

1        dbp          2015-04-06                    3                                 2015-04-07

2        dbp          2015-04-06                    1                                 2015-04-07

2        dbp          2015-04-06                    1                                 2015-04-07

2        dbp          2015-04-06                    2                                 2015-04-07

2        dbp          2015-04-06                    2                                 2015-04-07

2        dbp          2015-04-06                    2                                 2015-04-07

 

output need;

id       test            date                            pid                               treatment date                      flag

1        dbp          2015-04-06                    1                                 2015-04-07

1        dbp          2015-04-06                    2                                 2015-04-07

1        dbp          2015-04-06                    3                                 2015-04-07                             y

2        dbp          2015-04-06                    1                                 2015-04-07

2        dbp          2015-04-06                    1                                 2015-04-07

2        dbp          2015-04-06                    2                                 2015-04-07                             y

2        dbp          2015-04-06                    2                                 2015-04-07                              y

2        dbp          2015-04-06                    2                                 2015-04-07                              y

 

output getting;

id       test            date                            pid                               treatment date                      flag

1        dbp          2015-04-06                    1                                 2015-04-07

1        dbp          2015-04-06                    2                                 2015-04-07

1        dbp          2015-04-06                    3                                 2015-04-07                             y

2        dbp          2015-04-06                    1                                 2015-04-07

2        dbp          2015-04-06                    1                                 2015-04-07

2        dbp          2015-04-06                    2                                 2015-04-07                             y

2        dbp          2015-04-06                    2                                 2015-04-07                              y

2        dbp          2015-04-06                    2                                 2015-04-07                              

PROC Star
Posts: 7,467

Re: How to assign baseline flag to all OBS containing equal values of the sort order

Posted in reply to knveraraju91

Then I'd do it with a retain statement rather than using the lag function. e.g.:

 

data have;
  informat date treatment_date anydtdte10.;
  input id test $ date pid treatment_date;
  cards;
1 dbp 2015-04-06 1 2015-04-07
1 dbp 2015-04-06 2 2015-04-07
1 dbp 2015-04-06 3 2015-04-07
2 dbp 2015-04-06 1 2015-04-07
2 dbp 2015-04-06 1 2015-04-07
2 dbp 2015-04-06 2 2015-04-07
2 dbp 2015-04-06 2 2015-04-07
2 dbp 2015-04-06 2 2015-04-07
;

 

proc sort data=have;
  by id test descending date descending pid;
run;

 

data want (drop=last_Smiley Happy;
  set have;
  by id test date;
  retain last_flag last_pid;
  if first.test then do;
    flag = 'y';
    last_flag='y';
    last_pid=pid;
  end;
  else if last_flag eq 'y' and pid eq last_pid then flag='y';
run;

 

proc sort data=want;
  by id test date pid flag;
run;

 

HTH,

Art, CEO, AnalystFinder.com

 

Trusted Advisor
Posts: 1,137

Re: How to assign baseline flag to all OBS containing equal values of the sort order

Posted in reply to knveraraju91

You may as well try the proc sql approach

 

data have ;
input id       test$            date:$10.                            pid                               treatment_date:$10.;
cards;
1        dbp          2015-04-06                    1                                 2015-04-07
1        dbp          2015-04-06                    2                                 2015-04-07
1        dbp          2015-04-06                    3                                 2015-04-07
2        dbp          2015-04-06                    1                                 2015-04-07
2        dbp          2015-04-06                    1                                 2015-04-07
2        dbp          2015-04-06                    2                                 2015-04-07
2        dbp          2015-04-06                    2                                 2015-04-07
;

proc  sql ;
create table test as select a.*,b.flag from have as a left join (select distinct id, test,pid, 'Y' as flag from have group by id, test having pid=max(pid)) as b 
on a.id=b.id and a.test=b.test and a.pid=b.pid;
quit;
Thanks,
Jag
Ask a Question
Discussion stats
  • 6 replies
  • 161 views
  • 1 like
  • 3 in conversation