@FreelanceReinh, I tried that code, but I still get no output. @ballardw, I get no output at all. I see what you are saying about the nwords macro- I did not run that before. I have it now, but I am not entirely sure how to use it. Do I put my variables where it says "invar"? I attached a small subsample of the data I am working with. I attached an excel file because I was having trouble attaching a sas file. Please let me know if it be easier for me to just type an example! The code (nwords macro and winsorizing macro) is as follows. (Note: to begin, I am just trying to windsorize capxy and/or xrdy variables for each quarter. Eventually, I have a number of variables I intend to winsorize and will adjust the macro once I get it up and running.) %MACRO NWORDS (INVAR); %local N W; /* %let invar = %sysfunc(compbl(&invar)); */ %let N = 0; %let W = 1; %do %while (%nrquote(%scan(&invar,&W,%str( ))) ^= %str()); %let N = %eval(&N+1); %let W = %eval(&W+1); %end; &N %MEND NWORDS; %MACRO WINSORIZE (INSET=data.sashelp,OUTSET=winsor,SORTVAR=,VARS=capxy xrdy,PERC1=1,TRIM=0); /* List of all variables */ %let vars = %sysfunc(compbl(&vars)); %let nvars = %nwords(&vars); /* Display Output */ %put ### START.; /* Trimming / Winsorization Options */ %if &trim=0 %then %put ### Winsorization; %else %put ### Trimming; %put ### Number of Variables: &nvars; %put ### List of Variables: &vars; options nonotes; /* Ranking within &sortvar levels */ %put ### Sorting... ; proc sort data=&inset; by &sortvar; run; /* 2-tail winsorization/trimming */ %let perc2 = %eval(100-&perc1); %let var2 = %sysfunc(tranwrd(&vars,%str( ),%str(__ )))__; %let var_p1 = %sysfunc(tranwrd(&vars,%str( ),%str(__&perc1 )))__&perc1 ; %let var_p2 = %sysfunc(tranwrd(&vars,%str( ),%str(__&perc2 )))__&perc2 ; /* Calculate upper and lower percentiles */ proc univariate data=&inset noprint; by &sortvar; var &vars; output out=_perc pctlpts=&perc1 &perc2 pctlpre=&var2; run; %if &trim=1 %then %let condition = %str(if myvars(i)>=perct2(i) or myvars(i)<=perct1(i) then myvars(i)=. ); %else %let condition = %str(myvars(i)=min(perct2(i),max(perct1(i),myvars(i))) ); %if &trim=0 %then %put ### Winsorizing at &perc1.%... ; %else %put ### Trimming at &perc1.%... ; /* Save output with trimmed/winsorized variables */ data &outset; merge &inset (in=a) _perc; by &sortvar; if a; array myvars {&nvars} &vars; array perct1 {&nvars} &var_p1; array perct2 {&nvars} &var_p2; do i = 1 to &nvars; if not missing(myvars(i)) then do; &condition; end; end; drop i &var_p1 &var_p2; run; /* House Cleaning */ proc sql; drop table _perc; quit; options notes; %put ### DONE . ; %put ; %MEND WINSORIZE;
... View more