Here is another way. data have; input var1 var2 var3 var4 var5; id=_n_; datalines; 23 87 94 59 54 36 23 19 23 57 87 63 87 51 99 35 38 87 87 23 68 49 23 78 87 ; run; proc contents data = have out = haveVars(keep = varnum name) noprint; run; Proc Sql noprint; Select count(name) into :NmbrVrs separated by '' from haveVars where name contains "var"; Quit; %put &NmbrVrs var&NmbrVrs; %macro fndDplcts(); Data lst (drop=var1 - var&NmbrVrs); Set have; %do p = 1 %to &NmbrVrs; Nmbr=var&&p; varNm="var&&p"; VarNmId=compress(varNm||"_Id"||_N_); Cntr=1; output; %end; Run; %mend; %fndDplcts; PROC SORT DATA=LST OUT=LstSrt; BY Nmbr; RUN; PROC TRANSPOSE DATA=LstSrt OUT=LstTrnsps NAME=Source LABEL=Label; BY Nmbr; ID VarNmId; VAR Cntr; RUN; QUIT; Data LstTrnsps (drop= Source); Set LstTrnsps; array a(*) _numeric_; do i=1 to dim(a); if a(i) = . then a(i) = 0; end; drop i; run; proc contents data = LstTrnsps out = LstTrnspsVars(keep = varnum name) noprint; run; Proc Sql noprint; Select name into :VrsLst separated by ' ' from LstTrnspsVars where name contains "var"; Quit; %put &VrsLst; Data LstCnt; retain Nmbr Ttl &VrsLst; Set LstTrnsps; array vrArry &VrsLst; Ttl=0; do over vrArry; Ttl=Ttl+vrArry; end; run; Proc sort data=LstCnt; by descending Ttl; run;
... View more