Hello, I have found a solution to code concomitant medication use in SAS, but my code runs with error. Any suggestions on how to proceed?
ERROR: Invalid DO loop control information, either the INITIAL or TO expression is missing or the BY expression is missing, zero, or invalid.
data have; input ID DRUG $ START_DT :mmddyy. DAYS_SUPP END_DT :mmddyy.; datalines;; 1 A 2/17/10 30 3/19/10 1 B 5/6/09 30 6/5/09 1 C 7/9/11 60 9/7/11 1 E 3/1/10 90 5/30/10 1 B 1/1/09 90 4/1/09 1 D 2/1/09 30 3/3/09 1 C 5/6/12 90 8/4/12 2 B 4/1/12 60 5/31/12 2 A 7/1/10 30 7/31/10 2 C 8/3/10 90 11/1/10 2 D 11/1/13 90 1/30/14 2 E 12/5/13 90 3/5/14 2 A 2/1/11 90 5/2/11 2 F 12/16/13 30 1/14/14 ; data days; set have; dum = 1; do day = start_dt to end_dt;
by id; output; end; format day yymmdd10.; keep id drug day; run; proc sort data=days; by id day drug; run;
The error message is very clear. You have missing values. The LOG should show you the missing values.
Example:
19 data have; 20 input ID DRUG $ START_DT :mmddyy. DAYS_SUPP END_DT :mmddyy.; 21 format start_dt end_dt yymmdd10.; 22 datalines; NOTE: Invalid data for START_DT in line 24 5-11. RULE: ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0 24 1 B 5/60/09 30 6/5/09 ID=1 DRUG=B START_DT=. DAYS_SUPP=30 END_DT=2009-06-05 _ERROR_=1 _N_=2 NOTE: The data set WORK.HAVE has 2 observations and 5 variables. NOTE: DATA statement used (Total process time): real time 0.01 seconds cpu time 0.01 seconds 22 ! ; 25 ; 26 27 data days; 28 set have; 29 dum = 1; 30 do day = start_dt to end_dt; 31 output; 32 end; 33 format day yymmdd10.; 34 run; ERROR: Invalid DO loop control information, either the INITIAL or TO expression is missing or the BY expression is missing, zero, or invalid. ID=1 DRUG=B START_DT=. DAYS_SUPP=30 END_DT=2009-06-05 dum=1 day=. _ERROR_=1 _N_=2
You can trap those cases and not execute the DO loop when there are missing values.
if n(start_dt,end_dt)=2 then do day = start_dt to end_dt;
Your code does NOT throw an ERROR.
Koen
Whenever you get an error in the log, show us the ENTIRE log for the data step with the error, that's every single line in the log for the data step with the error, with nothing chopped out. Please follow these instructions to provide the log:
Please copy the log as text and paste it into the window that appears when you click on the </> icon. DO NOT SKIP THE PART IN RED.
Just for giggles, what do you think the BY ID in the Data Days data step is contributing to your code?
@ballardw The BY ID will do 2 things: 1) slow down the code 2) verify that the data is sorted (but this information is not saved).
The error message is very clear. You have missing values. The LOG should show you the missing values.
Example:
19 data have; 20 input ID DRUG $ START_DT :mmddyy. DAYS_SUPP END_DT :mmddyy.; 21 format start_dt end_dt yymmdd10.; 22 datalines; NOTE: Invalid data for START_DT in line 24 5-11. RULE: ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0 24 1 B 5/60/09 30 6/5/09 ID=1 DRUG=B START_DT=. DAYS_SUPP=30 END_DT=2009-06-05 _ERROR_=1 _N_=2 NOTE: The data set WORK.HAVE has 2 observations and 5 variables. NOTE: DATA statement used (Total process time): real time 0.01 seconds cpu time 0.01 seconds 22 ! ; 25 ; 26 27 data days; 28 set have; 29 dum = 1; 30 do day = start_dt to end_dt; 31 output; 32 end; 33 format day yymmdd10.; 34 run; ERROR: Invalid DO loop control information, either the INITIAL or TO expression is missing or the BY expression is missing, zero, or invalid. ID=1 DRUG=B START_DT=. DAYS_SUPP=30 END_DT=2009-06-05 dum=1 day=. _ERROR_=1 _N_=2
You can trap those cases and not execute the DO loop when there are missing values.
if n(start_dt,end_dt)=2 then do day = start_dt to end_dt;
SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!
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.
Ready to level-up your skills? Choose your own adventure.