BookmarkSubscribeRSS Feed
lmyers2
Obsidian | Level 7

How would you use the data step to find a specific value after a certain criteria is met. I have a long file that has timestamps that is sorted (sample below). I'm looking to find how many patients get "CPAP" any time after a row of HF. The answer here would be patient 1 and 2 so 2 of the 3 patients.

 

Patient     Tier     oxygen         Timestamp

1               1            NC                 Time

1               3            HF                  Time

1               3            CPAP             Time

2               3            HF                  Time

2               3            CPAP             Time

3               1            NC                  Time

5 REPLIES 5
PeterClemmensen
Tourmaline | Level 20

So what does your desired result look like? Do you want all observations for the ID's that satisfy this?

PeterClemmensen
Tourmaline | Level 20

If so then do

 

data have;
input Patient Tier oxygen $ Timestamp $;
datalines;
1 1 NC   Time
1 3 HF   Time
1 3 CPAP Time
2 3 HF   Time
2 3 CPAP Time
3 1 NC   Time
;

data want(drop = f:) ;
   do until(last.Patient);
      set have;
      by Patient;
      if oxygen = 'HF' then f1 = 1;
      if oxygen = 'CPAP' and f1 then f2 = 1; 
      output;
   end;

   do until (last.Patient);
      set have;
      by Patient;
      if f2 then output;
   end;
run;
lmyers2
Obsidian | Level 7
Thanks - does this take into account the order? Meaning the do loop will find HF then will continue looking for cpap lower down in a long file that is already sorted by time?

I think this code almost works but I get an error-73-322 “expecting an =“ on last.patient that doesn’t make sense...
Kurt_Bremser
Super User
It will process the dataset in the order it is stored. I found a mistake in my code I will correct.
In you have problems, please post the complete log into the appropriate text box.