#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.