Как выполнить одну и ту же процедуру SAS для нескольких наборов данных

Я собрал код Pro IML, который позволяет извлекать данные из определенного набора данных - хранящихся в рабочем каталоге - и выполняет простое уравнение. Результаты затем сохраняются в новом наборе данных.

proc iml  ;
use B1;
read all var _ALL_  into B1;
close B1;

g= B1[1,1];
ExG = B1[3,1];
Res = B1[5,1];
E =2;  
R =3;  

test =  g/(g+(ExG/E)+(Res/(R*E)));

print g ExG res test  [format = 10.6];
create try var {g ExG res test};
append;
close try;

run; quit;

Теперь я хотел бы применить эту процедуру к нескольким наборам данных, хранящимся в моей рабочей папке SAS, и добавить результаты, объединенные в новую папку. Наборы данных кодируются как B1, B2, B3... Я думаю, макрос SAS с функцией цикла необходим, но мои знания в этой области очень ограничены. Буду признателен за любую помощь.

1 ответ

Решение

В самом деле, вы можете использовать макрофункцию, чтобы сделать это легко так:

1) Установите пустой набор данных:

data result;
run;

2) Создайте макрофункцию для обработки вашего набора данных. Макропеременная VAR будет номером набора данных из вашего списка B1,B2,B3,B4.

%macro processDatasets(var);

proc iml  ;
use B&var;
read all var _ALL_  into B&var;
close B&var;
g=  B&var.[1,1];
ExG = B&var.[3,1];
Res = B&var.[5,1];
E =2;  
R =3;  

Здесь вы сохраняете значение с помощью symputx вызова ("g", B&var.[1,1], 'G');. А затем добавьте глобальную макро-переменную в набор данных to_store.

call symputx("g", B&var.[1,1], 'G');.
....

test =  g/(g+(ExG/E)+(Res/(R*E)));
print g ExG res test  [format = 10.6];
create try var {g ExG res test};
append;
close try;
run; quit;

Вот способ сохранить макро переменную в текущем наборе данных.

data to_store;
g=call symget("g");
ExG=call symget("ExG");
...
run;

3) Вот советы по объединению нескольких наборов данных в один.

data result;
    set result to_store;
run;

%mend processDataset;

4) Вы можете сделать несколько вызовов функции:

%processDataset(1);
%processDataset(2);
%processDataset(3);
...

5) Или вы можете просмотреть список номеров:

%macro processVarList;
%let var_list=1|2|3|4;
    %let k=1;
    %do %while (%qscan(&var_list, &k,|) ne );
        %let VAR = %scan(&var_list, &k,|);
        %processDataset(&var);
        %let k = %eval(&k + 1);
    %end;
%mend processVarList;
%processVarList;

6) Вы можете адаптировать этот код в соответствии с тем, что вы хотите сохранить в результирующем наборе данных. Я не тестировал код, но идея есть. Я предполагаю, что вы должны сохранить все свои переменные G, ExG, Res, E, R в наборе данных для слияния с набором данных конечного результата.

В конце вы получаете все свои значения в результирующем наборе данных.

Другие вопросы по тегам