03-23-2016 02:51 PM
I have been trying to figure out what I am doing wrong, but can't, so here I am posting the problem hoping someone can provide me some solution.
I have a IF statement within Do loop within DATA step. The IF statement evaluates by comparing Do loop index with a macro variable. Somehow the two values in comparison are not properly evaluated and thus, the codes always return ELSE values.
%macro TEMP(); %do i = 1 %to &Sample.; %do j = 1 %to &DD.; /*some codes*/ %let dsid = %sysfunc(open(TEMP_0)); %let CNT_0 = %sysfunc(attrn(&dsid,NOBS)); %let CC = %sysfunc(close(&dsid));
%let dsid = %sysfunc(open(TEMP_00)); %let CNT_00 = %sysfunc(attrn(&dsid,NOBS)); %let CC = %sysfunc(close(&dsid)); /*some codes*/ data TEMP_0_; set TEMP_0_; data TEMP_0_; set TEMP_0_; do k = 1 to &CNT_0.; if k <= &CNT_00. then Rand = 1; /*k and CNT_oo comparison is not properly evaluated*/ else Rand = 0; /* thus Rand is always 0*/ end; drop k; run; /*some codes*/ %mend TEMP;
03-23-2016 03:52 PM
Your code is syntactically correct (assuming that the %ENDs for the two %DO loops are hidden in "some codes").
I cannot replicate your issue. When I tested it with appropriate datasets TEMP_0 and TEMP_00, variable RAND was set to 1.
The duplicate line "data TEMP_0_; set TEMP_0_;" is redundant. The second data step could be simplified as follows:
data TEMP_0_; set TEMP_0_; Rand=ifn(&CNT_0, &CNT_0 <= &CNT_00, .); run;
Could you please provide small sample datasets (in the form of a data step) which demonstrate the issue?
03-23-2016 03:57 PM
I suppose this might happen if your second data set contains 0 observations. But you can make it easy to diagnose. Just add this before you run:
Then you will be able to see the values you are working with for your macro variables.