Зацикливание макросов SAS

Я работаю над набором данных, который имеет следующую структуру:

Color    Apple  Orange  Grape  Avocado  Blueberry
Yellow   1      .       .      .        .
Orange   .      1       .      .        . 
Purple   .      .       1      .        1  

Я хочу написать макрос, который создает таблицу для каждого типа фруктов, выбирая все цвета (строки) со значением 1. Например, таблица для яблока TBL_APPLE будет иметь 4 строки, как показано ниже.

В настоящее время я думаю, что перебираю как строки, так и столбцы. В качестве первого шага я превратил все переменные строк и столбцов в макросы:

    /*rows*/
    proc sql noprint; 
    select count(*) into :Nobs
    from work.fruit;
    select Color into :Attr1-:Attr%left(&Nobs)
    from work.fruit;quit;

    /*columns*/
    proc contents data=work.fruit out=contents noprint; run;
    %let n=&sqlobs;
    proc sql; select name into :fruit1-fruit%left(&n) from contents; quit;

    %macro fruit;
    %do i=1 %to &NObs;
    %do j=1 %to &n;
    proc sql;
    create table tlb_&&fruit&j as
    select *
    from work.fruit
    where &n = &n;
    quit;
    %end;
    %end;
    %mend fruit;
    %fruit;

person Pecanbutter    schedule 04.06.2015    source источник


Ответы (2)


Не уверен, что это то, что вы хотите, но, насколько я понимаю, проблема может быть упрощена, как показано ниже:

%macro fruit( type);    
   data &type ;
   set dataset;
   where &type = 1;
   run;
%mend fruit;
person yukclam9    schedule 05.06.2015

Я бы сначала определил макрос, который выполняет простую задачу, которую вы хотите повторить:

%macro fruitds(fruit);
data &fruit.(keep=color);
  set fruit;
  where &fruit eq 1;
run;
%mend fruitds;

Затем используйте шаг данных, читая имена столбцов из sashelp.vcolumns и call execute макроса для каждого имени столбца, отличного от Color.

data _null;
  set sashelp.vcolumn;
  call execute(cats('%fruitds(',name,')'));
  where libname eq 'WORK'
    and memname eq 'FRUIT'
    and name ne 'Color';
run;
person DWal    schedule 05.06.2015