Ошибка: индекс массива вне диапазона для i+2 лет
У меня есть набор данных, который выглядит следующим образом:
ID 2017 2018 2019 2020
2017 30 24 20 18
2018 30 24 20 18
2019 30 24 20 18
2020 30 24 20 18
Я ищу, чтобы создать массив на основе нескольких входов:
%let FixedorFloating = '1 or 0';
%let Repricingfrequency = n Years;
%let LastRepricingDate = 'Date'n;
Критерии массива таковы, что если ID= год +2i, то флаг = 1
например
ID = 2017 then flag =1 for Years 2017 and 2019, 0 otherwise
ID = 2018 then flag = 1 for Years 2018 and 2020, 0 otherwise
ID = 2019 then flag = 1 for Year 2019 , 0 otherwise
ID = 2020 then flag = 1 for year 2020, 0 otherwise
Мой код в настоящее время, у меня проблемы с годом я +2 (выделено красным цветом), но год (я) работает нормально.
data ReferenceRateContract;
set refratecontract;
*arrays for years and flags;
array _year(2017:2022) year2017-year2022;
array _flag(2017:2022) flag2017-flag2022;
* цикл по массиву;
if &FixedorFloating=1
then do i=&dateoflastrepricing to hbound(_year);
/*check if year matches year in variable name*/
if put(ID, 4.) = compress(vname(_year(i)),, 'kd')
then _flag(i)=1;
else _flag(i)=0;
end;
else if &fixedorfloating=0
then do i=&dateoflastrepricing to hbound(_year);
if put(ID, 4.) = compress(vname(_year(i)),, 'kd')
then _flag(i)=1;
else if put(ID, 4.) = compress(vname(_year(i+2)),, 'kd')
then _flag(i)=1;
else _flag(i)=0;
end;
drop i;
бежать;
data referenceratecontract;
set referenceratecontract;
keep flag2017--flag2020;
run;
Ищете способ пометки на основе Id= Год + 2i, TIA
***else if put(ID, 4.) = compress(vname(_year(i+2)),, 'kd') then _flag(i)=1;***
1 ответ
Проблема заключалась в том, что я должен был поставить I - 2
вместо I + 2
Кроме того, мне пришлось изменить пределы массива, так как мой hbound пытался выполнить итерации до конца матрицы.