У меня есть существующий набор переменных a_0, ..., a_45, где a_i представляет количество вещей, которые у меня есть в день i. Я хотел бы создать новую коллекцию переменных b_0, ..., b_45 для представления дополнительных изменений в материалах, которые у меня есть в день i (т.е. b_k = a_k-a_ (k-1)). Мой подход:
data test;
set dataset;
array a a_0-a_45;
array b b_0-b_45;
b(1)=a(1);
do i=2 to 45;
b(i)=a(i)-a(i-1);
end;
run;
Однако мои переменные b просто отсутствуют.
Ваш код в порядке. Вам нужно показать пример данных, где он не работает.
Почему вы моделируете данные таким образом? Почему бы не иметь 46 строк с двумя переменными DAY и A, где DAY идет от 0 до 45?
Я не вижу рекурсии - вы имели в виду итерацию?
В массиве 46 элементов. Шлейф должен быть 2 to 46. Это может способствовать, а может и не способствовать вашей проблеме. Обычно ... to DIM(array) используется для перехода к последнему элементу типичного одномерного массива. Если оператор массива определяет границы индекса, вы должны использовать LBOUND(array) to HBOUND(array) для итерации от нижней до верхней границы индекса. Для многомерных (или n-мерных) массивов используется синтаксис LBOUND(array-name,dimension-n).



Какие у вас начальные значения для a_1 - a_45 перед запуском цикла? Поскольку вы не инициализируете их (за исключением a_0 ≡ a(1)), каждый член b(i) будет отличаться от двух терминов a, из которых по крайней мере один будет отсутствовать, если эти переменные не заполнены во входном наборе данных.
извините, это была опечатка. Мои переменные уже существуют и имеют значения. Я хочу создать значения b на основе этих существующих значений a
Вот пример кода, показывающий, что вычисление дельты является правильным, когда имена переменных в наборе данных совпадают с переменными, указанными в операторе массива на этапе данных.
Пример данных
data have(keep=product_id note a_:);
do product_id = 1 to 100;
length note $15;
array amount a_0-a_45;
call missing(of amount(*));
if (ranuni(123) < 0.5) then do;
note = 'static deltas';
static_delta = ceil(5 * ranuni(123));
amount(1) = static_delta;
do inventory_day = 2 to dim(amount);
amount(inventory_day) = amount(inventory_day-1) + static_delta;
end;
end;
else do;
note = 'random deltas';
amount(1) = ceil(5 * ranuni(123));
do inventory_day = 2 to dim(amount);
amount(inventory_day) = max ( 0, amount(inventory_day-1) + floor(10 * ranuni(123)) - 5 );
end;
end;
OUTPUT;
end;
run;
Вычислить дельты
data want;
set have;
array amount a_0-a_45;
array delta b_0-b_45;
delta(1) = amount(1);
do i=2 to dim(amount);
delta(i) = amount(i) - amount(i-1);
end;
drop i;
format a_: b_: 4.;
run;
Как Ричард уже предложил в своем комментарии, когда я работал над написанием кода ... По сути, единственная ошибка, которая есть в вашем коде, заключается в том, что ваш код должен зацикливаться от 2 до 46, поскольку в массиве 46 элементов. приведенный ниже код должен работать для вас.
%macro f();
data dataset;
%do i = 0 %to 45;
a_&i. = ranuni(2);
%end;
run;
%mend;
%f();
data test;
set dataset;
array a1 a_0-a_45;
array b1 b_0-b_45;
/* This line will help in avoiding b_0 to have a missing value */
b1(1)=a1(1);
do i=2 to 46;
b1(i)=a1(i)-a1(i-1);
end;
run;
Можете ли вы предоставить образцы данных и полный код, чтобы мы могли воспроизвести проблему? На данный момент неясно, чего вы хотите или что не работает должным образом. С кодом все в порядке.