Цикл вокруг всего шага данных в SAS - PullRequest
0 голосов
/ 19 марта 2019

Итак, у меня есть следующий код:

% let macroVar = Var1 Var2;

Data new1;
Set old1 (keep= count &macroVar.);
Run;

Proc means data = new1 nway missing noprint;
Class var1;
Var count;
Output out= out_var1 sum=;

Proc means data = new1 nway missing noprint;
Class var2;
Var count;
Output out= out_var2 sum=;

Как я могу выписать два средства proc за один шаг данных, используя макропеременнуюЯ настроил в начале?

Большое спасибо

1 Ответ

0 голосов
/ 19 марта 2019

Почему бы просто не сделать это за один вызов PROC MEANS?

%let varlist=sex age ;
proc means data=sashelp.class missing noprint;
  class &varlist;
  ways 1;
  var height;
  output out=want sum=;
run;

Результат:

Obs    Sex    Age    _TYPE_    _FREQ_    Height

 1             11       1         2       108.8
 2             12       1         5       297.2
 3             13       1         3       184.3
 4             14       1         4       259.6
 5             15       1         4       262.5
 6             16       1         1        72.0
 7      F       .       2         9       545.3
 8      M       .       2        10       639.1

Если вам действительно нужны отдельные наборы выходных данных, то их будет быстрее генерироватьиз вышеприведенного вывода.

%macro sum_counts(varlist,data=,var=count);
%local i n;
%let n=%sysfunc(countw(&varlist));

proc means data=&data missing noprint ;
  class &varlist;
  ways 1;
  var &var;
  output out=_summary_ sum=;
run;

%do i=1 %to &n;
  data new&i;
    set _summary_;
    where _type_=2**(&n-&i);
    keep %scan(&varlist,&i) &var;
  run;
%end;

%mend sum_counts;

Пример:

263   options mprint;
264   %sum_counts(varlist=sex age,data=sashelp.class,var=height);
MPRINT(SUM_COUNTS):   proc means data=sashelp.class missing noprint ;
MPRINT(SUM_COUNTS):   class sex age;
MPRINT(SUM_COUNTS):   ways 1;
MPRINT(SUM_COUNTS):   var height;
MPRINT(SUM_COUNTS):   output out=_summary_ sum=;
MPRINT(SUM_COUNTS):   run;

NOTE: There were 19 observations read from the data set SASHELP.CLASS.
NOTE: The data set WORK._SUMMARY_ has 8 observations and 5 variables.

MPRINT(SUM_COUNTS):   data new1;
MPRINT(SUM_COUNTS):   set _summary_;
MPRINT(SUM_COUNTS):   where _type_=2**(2-1);
MPRINT(SUM_COUNTS):   keep sex height;
MPRINT(SUM_COUNTS):   run;

NOTE: There were 2 observations read from the data set WORK._SUMMARY_.
      WHERE _type_=2;
NOTE: The data set WORK.NEW1 has 2 observations and 2 variables.

MPRINT(SUM_COUNTS):   data new2;
MPRINT(SUM_COUNTS):   set _summary_;
MPRINT(SUM_COUNTS):   where _type_=2**(2-2);
MPRINT(SUM_COUNTS):   keep age height;
MPRINT(SUM_COUNTS):   run;

NOTE: There were 6 observations read from the data set WORK._SUMMARY_.
      WHERE _type_=1;
NOTE: The data set WORK.NEW2 has 6 observations and 2 variables.
...