BookmarkSubscribeRSS Feed
Ivy
Quartz | Level 8 Ivy
Quartz | Level 8

Dear friends, 

 

I would like to create the "combo2 and old" at the highlight below based on the conditions, and comparing the variables at end of the condition or 1st record dose not apply the condition. I am wondering what is wrong with the "do while" statement.

   Thank you very much!

 


data t;
input dt date9. name $ ;
format dt mmddyy10.;
datalines;
09SEP2015 a
29SEP2015 b
30SEP2015 a
06OCT2015 b
02NOV2015 c
16NOV2015 a
23NOV2015 c
30NOV2015 a
;
run;

 

data t1;
set t;


format dt1 mmddyy10. ;
retain dt1 combo1 combo2;

length combo1 combo2  $20. ; 

 

if name = 'c' and dt ='02NOV2015'd then do;
combo1 = 'a+b';
combo2 = 'c';
dt1 = dt;
end;

 

 

else  do;

 

         do while (.< dt1 < dt < dt1 + 20);
               if findw(combo2, strip(name)) = 0 then combo2 = cats(combo2,"+", strip(name));
        end;

 

      do i = 1 to countc(combo1, "+") + 1 ;
         if findw(combo2, strip(scan(combo1, i, "+"))) > 0 then old = 1;
      else old = 0;
      end;

 

end;

 

run;

 

dtnameCombo1combo2oldDt1
9/9/2015a    
9/29/2015b    
9/30/2015a    
10/6/2015ba+b   
11/2/2015c   11/2/2015
11/16/2015a c+a111/2/2015
11/23/2015c   11/2/2015
11/30/2015a   11/2/2015
7 REPLIES 7
PeterClemmensen
Tourmaline | Level 20

I'm not really following the logic here. Can you elaborate?

Ivy
Quartz | Level 8 Ivy
Quartz | Level 8
When I see name "c", I want to evaluate all the names during the conditional date (20 days period after seeing name "C"), then at the last record of the conditions to comparing with "a+b".
Astounding
PROC Star

Start here and see if this clears it up.  This statement causes a problem:

 

combo2 = 'c';

 

It defines COMBO2 as being 1 character long, so there isn't room to add more characters to the end of it.  Try adding this statement beforehand:

 

length combo2 $ 10;

Ivy
Quartz | Level 8 Ivy
Quartz | Level 8
The problem is " DO While" do not run. 😞
Astounding
PROC Star

Good thing it didn't run.  If it did run, it would still be running for as long as you keep your computer turned on.  The logic of the DO WHILE loop will never change your condition from being true to being false, so it will run forever. 

 

Perhaps you should explain what it is you would like the DO WHILE loop to accomplish, and we can modify the program accordingly.

Ivy
Quartz | Level 8 Ivy
Quartz | Level 8
Thanks. My goal is below, actually, the program is running never stops.

When I see name "c", I want to evaluate all the names during the conditional date (20 days period after seeing name "C"), then at the last record of the conditions to comparing with "a+b".
ballardw
Super User

@Ivy wrote:

Dear friends, 

 

I would like to create the "combo2 and old" at the highlight below based on the conditions, and comparing the variables at end of the condition or 1st record dose not apply the condition. I am wondering what is wrong with the "do while" statement.

   Thank you very much!

 


data t;
input dt date9. name $ ;
format dt mmddyy10.;
datalines;
09SEP2015 a
29SEP2015 b
30SEP2015 a
06OCT2015 b
02NOV2015 c
16NOV2015 a
23NOV2015 c
30NOV2015 a
;
run;

 

data t1;
set t;


format dt1 mmddyy10. ;
retain dt1 combo1 combo2;

length combo1 combo2  $20. ; 

 

if name = 'c' and dt ='02NOV2015'd then do;
combo1 = 'a+b';
combo2 = 'c';
dt1 = dt;
end;

 

 

else  do;

 

         do while (dt1 < dt < dt1 + 20);
               if findw(combo2, strip(name)) = 0 then combo2 = cats(combo2,"+", strip(name));
        end;

 

      do i = 1 to countc(combo1, "+") + 1 ;
         if findw(combo2, strip(scan(combo1, i, "+"))) > 0 then old = 1;
      else old = 0;
      end;

 

end;

 

run;

 

 

dt name Combo1 combo2 old
9/9/2015 a      
9/29/2015 b      
9/30/2015 a      
10/6/2015 b a+b    
11/2/2015 c   c  
11/16/2015 a   c+a 1
11/23/2015 c      
11/30/2015 a      

Since DT1 starts out = DT and never changes  the comparison

(dt1 < dt < dt1 + 20)

is always false. For any value  A<A is false. So the Do While loop never initiates because you have told it not to.

For that Do While loop to have any  use you likely need to be doing something, but I haven't a clue what the need is, to the variable DT1 and your start condition needs to be better defined as well as your rule for how to determine which records need to be processed in general.

 

sas-innovate-2024.png

Available on demand!

Missed SAS Innovate Las Vegas? Watch all the action for free! View the keynotes, general sessions and 22 breakouts on demand.

 

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.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 7 replies
  • 592 views
  • 0 likes
  • 4 in conversation