Hi. I am analyzing differences in data generated by different surveys. I have a couple of thousand variables and 10 survey versions. I compare variable by variable with proc npar1way, and I want to automate this procedure. The problem with npar1way is that it quits as soon it discovers a variable having values with only one level at the chosen class variable. The procedure does not continue, but quits instead. So it seems I need to take away those variables in the first place. Here is an example of doing this, but it is not fool proof, because the "proc tabulate" adds a "_N" at the end of all variable names. This macro will fail on variables already being 32 characters wide. Can it be improved or made over? %macro qc_loopitem(module); title &module; data npar1way_&module (keep = &module: survey_version); set x; run; %charToNumeric(work, npar1way_&module, &module); proc tabulate data = npar1way_&module order = freq out = tmp_npar1way_&module; class survey_version; var &module:; table survey_version, n * &module:; run; data tmp_npar1way_&module; set tmp_npar1way_&module; array module(*) &module:; do i = 1 to dim(module); call symput(cat("mod", i), ' '); call symput('n', i); if module = 0 then call symput(cat("mod", i), vname(module)); end; run; %macro qc_dropvar; data tmp_npar1way_&module (drop = %do i = 1 %to &n; &&mod&i %end;); set tmp_npar1way_&module; run; %mend; %qc_dropvar; proc sql noprint; select substr(trim(name), 1, index(name, '_N') - 1) into :modulestr separated by ' ' from dictionary.columns where libname = 'WORK' and memname = "%upcase(tmp_npar1way_&module)" and (name like "&module.%"); quit; proc npar1way data = npar1way_&module wilcoxon median; class survey_version; var &modulestr:; output out = npar1way_&module; run; %mend; %macro qc_loop; %do i = 1 %to %sysfunc(countw(&ka_modules)); %qc_loopitem(%scan(&ka_modules, &i, ' ')); %end; data npar1way; set npar1way_:; run; proc datasets lib = work nolist; delete npar1way_: tmp_npar1way_:; run; quit; %mend; %qc_loop;
... View more