Передача аргумента в функцию SAS с использованием переменной SAS

#arrays #function #sas

#массивы #функция #sas

Вопрос:

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

 | var_1 | var_2 | var_3 | var_4 | maximum till | formula used         | var_output |
|-------|-------|-------|-------|--------------|----------------------|------------|
| 3     | 6     | 9     | 12    | 4            | =max(of var_1-var_4) | 12         |
| 1     | 10    | 100   | 1000  | 2            | =max(of var_1-var_2) | 10         |
| 5     | 15    | 25    | 35    | 3            | =max(of var_1-var_3) | 25         |
  

Ценю любую помощь. Спасибо 🙂

Ответ №1:

Используйте цикл выполнения и скользящий максимум:

 data want;
    set have;
    array vars{4} var1-var4;
    do i = 1 to max_till;
        var_out = max(vars{i},var_out);
    end;
run;
  

Ответ №2:

Решение FCMP. Это похоже на решение пользователя 667489, но реализовано как функция. Это будет работать только в 9.4 и, возможно, только в 9.4 TS1M0 .

 data have;                       *some data;
input var1-var4 varmax;
datalines;
3 6 9 12 4
1 10 100 1000 2
5 15 25 35 3
;;;;
run;

proc fcmp outlib=work.funcs.func; *store functions here;
function maxof(mxarr[*],maxlim);  *returns numeric;
    do _i = 1 to maxlim;
      _max = max(mxarr[_i],_max);
    end;
    return(_max);
endsub;
run;

options cmplib=work.funcs;        *define where functions come from;    
data want;
set have;
array vars var1-var4;
varout = maxof(vars,varmax);      *use function (pass array by reference);
run;
  

Комментарии:

1. Поскольку временные массивы не могут быть переданы в качестве аргументов функциям в 9.3.