0

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

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

用于在当年重新定价时浮动 flag=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
4

1 回答 1

0

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

于 2018-03-19T12:23:27.367 回答