阵列突然不起作用

时间:2018-03-19 10:31:56

标签: arrays loops for-loop sas sas-studio

我一直在使用一个在最近的数据更新之前一直工作的数组。可以按如下方式构建示例数据集:

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

1 个答案:

答案 0 :(得分:0)

多么奇怪,如果我删除“else if”并替换为“If”,那么它就可以了。