vendredi 10 juillet 2020

In SAS, how do you stop flagging a group of rows if a specific condition is met?

I have a table in SAS dataset that looks like this:

proc sql;
create table my_table
    (id char(1),
    my_date num format=date9.,
    my_col num);
insert into my_table
    values('A','01JAN2010'd,.)
    values('A','02JAN2010'd,0)
    values('A','03DEC2009'd,1)
    values('A','04NOV2009'd,1)
    values('B','01JAN2010'd,.)
    values('B','02NOV2009'd,2)
    values('C','01JAN2010'd,.)
    values('C','02OCT2009'd,3)
    values('D','01JAN2010'd,.)
    values('D','02NOV2009'd,2)
    values('D','03OCT2009'd,1)
    values('D','04AUG2009'd,2)
    values('D','05MAY2009'd,3)
    values('D','06APR2009'd,1);
quit;

I am trying to create a new column desired that, for each group of id column, flags the row with a value of 1 if the value in my_col is missing or less than 3.

The part I'm having trouble with is that when there is a my_col value that is greater than 2, I need the desired value for that row to be missing and also stop flagging any remaining rows in the id group with a value of 1.

The resulting dataset should look like this:

+----+-----------+--------+---------+
| id | my_date   | my_col | desired |
+----+-----------+--------+---------+
| A  | 01JAN2010 | .      | 1       |
| A  | 02JAN2010 | 0      | 1       |
| A  | 03DEC2009 | 1      | 1       |
| A  | 04NOV2009 | 1      | 1       |
| B  | 01JAN2009 | .      | 1       |
| B  | 02NOV2009 | 2      | 1       |
| C  | 01JAN2010 | .      | 1       |
| C  | 02OCT2009 | 3      | .       |
| D  | 01JAN2010 | .      | 1       |
| D  | 02NOV2009 | 2      | 1       |
| D  | 03OCT2009 | 1      | 1       |
| D  | 04AUG2009 | 2      | 1       |
| D  | 05MAY2009 | 3      | .       |
| D  | 06APR2009 | 1      | .       |
+----+-----------+--------+---------+

Aucun commentaire:

Enregistrer un commentaire