Hello all. I'm working with a large dataset on vaccines currently and am having trouble looping over an ordered set of macro variables. I'm using SAS 9.4. Goal: Create dummy coded variables for 85 vaccines that are indicated across 8 variables (vax1-vax8). Perhaps someone may have have an easier way. I used the following code to obtain the list of vaccine names: %MACRO vaxNames(data=, fileOut=); *MACRO that delivers a list of all vaccine names as variable NAME in a given dataset;
PROC FREQ DATA=&data NOPRINT; *this code also drops ()_- and adds a _ when first character is numeric;
TABLE vax1 / OUT=&fileOut;
WHERE LENGTH(vax1)>1;
RUN;
DATA &fileOut;
SET &fileOut;
vax=vax1;
NAME=vax1;
NAME=COMPRESS(NAME,"()_-");
IF VERIFY(SUBSTR(NAME,1,1),'0123456789')=0 THEN NAME="_"||NAME;
KEEP NAME vax;
RUN;
%MEND vaxNames; The NAME variable is the vaccine codeword modified to be a variable name, while vax is the raw text that matches exactly to the text input for vax1-vax8. To create the dummy codded variables, what I want to do is as follows: 1) Create 85 new variable that are named as the NAME variable in the previous dataset. 2) For each single vaccine, loop over vax1-vax8 to see if that variable = vax from the previous dataset. 3) Loop this 85 times to cover all possible vaccines My method so far has been the following. I use this code to create a series of macro variables that match NAME (vaxvar1-vaxvar85), vax (vaxtxt1-vaxtxt85), and eof (# of vaccines): DATA _NULL_; *creates macro for vaccine reference (v1-v85) and end of file # (eof) based on output of vaxNames MACRO;
SET vaers.vaxnames NOBS=nobs;
CALL SYMPUT("eof",left(put(nobs,best.))); *vaxvar1-vaxvar85 is the VARIABLE vaxine name";
CALL SYMPUT('vaxvar'||LEFT(_N_),NAME); *vaxtxt1-vaxtxt85 is the VAX name to verify against vax1-vax8;
CALL SYMPUT('vaxtxt'||LEFT(_N_),vax);
RUN; Then, trying to create my dummy coded dataset, I've started with a simple scenario by just doing 1 single iteration: DATA testdataDummy;
SET testdata;
IF vax1="&vaxtxt1." THEN &vaxvar1=1;
RUN; This works well and produces a new variable with the name according to vaxvar and a 1 if vax1=vaxtxt1. Perfect. Then, trying to expand this to a loop is where it all falls apart: DATA testdataDummy;
SET testdata;
DO i=1 TO &eof;
IF vax1="&vaxtxt&i." THEN &vaxvar&i=1;
END;
RUN; The &eof resolves fine and the loop runs in that regard. The way I reference vaxtxt&i also works. However, &vaxvar&i does not work and gives me the following error: 133 DATA testdataDummy;
134 SET testdata;
135 DO i=1 TO &eof;
136 IF vax1="&vaxtxt&i." THEN &vaxvar&i=1;
-
180
WARNING: Apparent symbolic reference VAXTXT not resolved.
WARNING: Apparent symbolic reference I not resolved.
WARNING: Apparent symbolic reference VAXVAR not resolved.
WARNING: Apparent symbolic reference I not resolved.
ERROR 180-322: Statement is not valid or it is used out of proper order. I'm still a bit new to macros, so perhaps I'm referencing it wrong in my loop. Any help would be so greatly appreciated. Perhaps there is a more efficient way to get at what I'm trying to do here. Thank you!
... View more