如何找到第一个变量,以便之后的每个变量变量具有相同的值?

时间:2017-01-26 23:51:55

标签: loops sas

我有数据,其中变量系统地命名为fr(yyyy),并且只有1个观察值。我认为它是一个函数fr(yyyy)= x。在某些时候,这个函数变得不变,我想让一个宏变量等于函数恒定的第一年。数据从2016年到2078年。以下是它的外观示例;

source data example

此数据的正确答案是short_end = 2021。

这是我的尝试;

%let fundyr = 2017;
%let endyr = 2078;

data test;
    set disc_rates;
ARRAY  fr{%eval(&fundyr.-1):&endyr.} fr%eval(&fundyr.-1)-fr&endyr.; 
do i = &fundyr. to &endyr.;
    if fr(i) ne fr(i-1) then do j = i to (&endyr.-i);
        if and(fr(i) = fr(j)) then short_end = i; 
        end;
    end;
run;

我认为逻辑上它是有意义的(但它可能还是非常正确),但是没有和()函数将会'和'一起编辑任意数量的逻辑语句。关于如何克服这个问题或采用不同方法的任何建议?另外,如果找到这个变量的宏变量怎么办?

如果你需要一些数据,可以用它来创建一些

data disc_rates;
fr2017 = 0.1;
fr2018 = 0.2;
fr2019 = 0.3;
fr2020 = 0.4;
fr2021 = 0.3;
fr2022 = 0.3;
fr2023 = 0.3;
fr2024 = 0.3;
run;

1 个答案:

答案 0 :(得分:4)

向后遍历数组

data disc_rates;
fr2017 = 0.1;
fr2018 = 0.2;
fr2019 = 0.3;
fr2020 = 0.4;
fr2021 = 0.3;
fr2022 = 0.3;
fr2023 = 0.3;
fr2024 = 0.3;
run;

data want;
  set disc_rates;
  array fr[*] fr2017-fr2024;
  final_rate = fr[dim(fr)];
  do _i = dim(fr) to 1 by -1;
    if fr[_i] ne final_rate then leave;
  end;
  final_rate_index = _i+1;  *_i will be highest non-identical; _i+1=lowest identical;
   Final_rate_year = vname(fr[final_rate_index]);
run;