0
votes

I have a very simple request. Loop through a dataset, turning each observation into a macro variable, and then doing a comparison on that macro variable. here's what my code looks like:

%do n = 1 %to &i2.;

data want;
set have;
%if _N_ = &n. %then %do;
call symputx("Var1",var1);
call symputx("var2",var2);
%end;
run;

data want;
retain FinalCount
set have;
where Variable1="&var1.";
by SomeVariable
if first.SomeVariable then FinalCount=0;
if final="FINAL" then FinalCount+1;
if Finalcount=&var2. then Final_Samples=1;
finalCount=FinalCount;
run;

%end

The part that is failing in the _N_ = &n. section. I keep getting the error "Variable N has been defined as both character and numeric." Basically I just need to set each observation as a macro variable once to do the next comparison, and then move on to the next guy. So, if there's a better way of doing that, please let me know. Otherwise, could you help me figure out why that comparison is not working?

1
The value of the macro variable N is a digit strings like 1, 23, etc. It will never be equal to the letter string _N_. Perhaps you want an actual IF statement instead of the macro statement there?Tom
I think it should be if _N_ = &n then do; right?SAS2Python

1 Answers

2
votes

If you could explain your larger problem then you might get a better answer that does not require you to convert your data values into macro variables. Converting values to strings and then trying to compare them again introduces a number of sources of errors.

To your question of how to set macro variables based on the Nth observation in a dataset, try one of these.

If it supports the FIRSTOBS= and OBS= dataset options.

data _null_;
  set have (firstobs=&n obs=&n);
  call symputx("Var1",var1);
  call symputx("var2",var2);
run;

If the dataset supports direct access then use that.

data _null_;
  p = &n;
  set have point=p;
  call symputx("Var1",var1);
  call symputx("var2",var2);
  stop;
run;

If not then use an IF (not a macro %if).

data _null_;
  set have ;
  if _n_ = &n then do;
    call symputx("Var1",var1);
    call symputx("var2",var2);
    stop;
  end;
run;