我一直在使用一个在最近的数据更新之前一直工作的数组。可以按如下方式构建示例数据集:
Data Have;
input Fixed_or_floating $ ID Vintage Base2017 Base2018 Base2019 Base2020 dateoflastrepricing repricingfrequency;
datalines;
FLT 1 2017 0 0 0 0 2011 2
FLT 1 2018 0 0 0 0 2011 2
FLT 1 2019 0 0 0 0 2011 2
FLT 1 2020 0 0 0 0 2011 2
FLT 2 2017 0 0 0.1 0.1 2014 1
FLT 2 2018 0 0 0.1 0.1 2014 1
FLT 2 2019 0 0 0.1 0.1 2014 1
FLT 2 2020 0 0 0.1 0.1 2014 1
FIX 3 2017 0.1 0.3 0.2 0.1 2016 3
FIX 3 2018 0.1 0.3 0.2 0.1 2016 3
FIX 3 2019 0.1 0.3 0.2 0.1 2016 3
FIX 3 2020 0.1 0.3 0.2 0.1 2016 3
FLT 4 2017 0 0 0.1 0 2016 1
FLT 4 2018 0 0 0.1 0 2017 1
FLT 4 2019 0 0 0.1 0 2017 1
FLT 4 2020 0 0 0.1 0 2017 1
;
run;
该对象是创建一个数组,当该年份等于基准年(取决于某些限制)时,该数组放置一个标志= 1:
对于固定资产来说很容易,当年份=基准年时,旗帜只需要= 1
Flag2017 Flag2018 Flag2019 Flag2020
1 0 0 0
0 1 0 0
0 0 0 1
在该年度重新定价时浮动旗帜= 1。因此,例如,如果最后一次重新定价是在2011年并且每两年重新定价,则在2011年,2013年,2015年,2017年,2019年,2021年重新定价。然后在2018年,它在2年时间内重新定价。然后到2019年,在2年时间内重新定价。我只是在庆祝2017-2020年,所以我要寻找一个像这样的表
Vintage Flag2017 Flag2018 Flag2019 Flag2020
2017 1 0 1 0
2018 0 0 0 1
2019 0 0 0 0
2020 0 0 0 0
我以前使用的代码是:
data want;
set have;
*arrays for years and flags;
array _Base(2014:2022) Base2014-Base2022;
array _flag(2017:2022) flag2017-flag2022;
*loop over array;
if upcase(FixedorFloating)="FIX"
then do i=2017 to 2020;
/*check if year matches year in variable name*/
if put(Vintage, 4.) = compress(vname(_Base(i)),, 'kd')
then _flag(i)=1;
end;
else if upcase(fixedorfloating)="FLT" and repricingfrequency=2
then do i=2017 to 2020;
if put(Vintage, 4.) = compress(vname(_Base(i)),, 'kd')
then _flag(i)=1;
else if put(Vintage, 4.) = compress(vname(_Base(i-2)),, 'kd')
then _flag(i)=1;
end;
else if upcase(fixedorfloating)="FLT" and repricingfrequency=1
then do i=2017 to 2020;
if put(Vintage, 4.) <= compress(vname(_Base(i)),, 'kd')
then _flag(i)=1;
end;
else if upcase(fixedorfloating)="FLT" and repricingfrequency>=3
then do i=2017 to 2020;
if put(Vintage, 4.) = compress(vname(_Base(i)),, 'kd')
then _flag(i)=1;
else if put(Vintage, 4.) = compress(vname(_Base(i-3)),, 'kd')
then _flag(i)=1;
end;
drop i;
run;
我已经意识到,如果年份是偶数或奇数,我需要加入一个问题,我稍后会添加它。我的问题是为什么我得到这个错误,数组应该足够大以进行操作?
ERROR: Array subscript out of range at line 87 column 42.
87 if put(Vintage, 4.) = compress(vname(_Base(i)),, 'kd')
88 then _flag(i)=1;
编辑:附加日志
Fixed_or_floating=FLT ID=1 Vintage=2017 Base2017=0 Base2018=0 Base2019=0 Base2020=0
dateoflastrepricing=2011 repricingfrequency=2 Base2014=. Base2015=. Base2016=. Base2021=.
Base2022=. flag2014=. flag2015=. flag2016=. flag2017=. flag2018=. flag2019=. flag2020=. flag2021=.
flag2022=. i=2017 _ERROR_=1 _N_=1
答案 0 :(得分:0)
多么奇怪,如果我删除“else if”并替换为“If”,那么它就可以了。