嵌套如果做语句SAS

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌套如果做语句SAS相关的知识,希望对你有一定的参考价值。

我有一个如下所示的数据集:

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;

到目前为止我的代码看起来像这样:

data ReferenceRateContract;
set refratecontract;

*arrays for years and flags;
array _year(2017:2020) year2017-year2020;
array _flag(2017:2020) flag2017-flag2020;

*loop over array;

if &FixedorFloating=1;

    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;

    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*i)),, 'kd') 
        then _flag(i)=1;

        else _flag(i)=0;
        end;

drop i;

run;

该代码适用于原始的if函数,但我想通过引入else如果FixedorFloating = 0来使其更加动态。

我也希望能够使我的功能能够破译身份证是否在ID上一年+ 2i年。即

if ID=2017 - i'd like a 1 for years 2017, 2019. For ID=2018, 
I'd like a 1 for 2018, 2020 and so on hence the 

year(I-2*I)

我不确定这是合理的还是不正确的。

日志的错误如下所示:

82         else if &fixedorfloating=0;
         ____
         160
 ERROR 160-185: No matching IF-THEN clause.

 84         then do i=&dateoflastrepricing to hbound(_year);
          ____
          180
 ERROR 180-322: Statement is not valid or it is used out of proper order.


 91         else _flag(i)=0;
 92         end;
           ___
           161
 ERROR 161-185: No matching DO/SELECT statement.

我假设if后跟一个else - 如果没有正确的结构。

答案

问题出在这里:

if &FixedorFloating=1;
  do i=&dateoflastrepricing to hbound(_year);

第一个if是“gating if”,意味着只处理匹配条件的记录。

尝试更改为:

if &FixedorFloating=1 then
  do i=&dateoflastrepricing to hbound(_year);
另一答案
data ReferenceRateContract;
set refratecontract;

*arrays for years and flags;
array _year(2017:2020) year2017-year2020;
array _flag(2017:2020) flag2017-flag2020;

*loop over array;

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*i)),, 'kd') 
  then _flag(i)=1;
  else _flag(i)=0;
end;
drop i;
run;

作者:KurtBremser

以上是关于嵌套如果做语句SAS的主要内容,如果未能解决你的问题,请参考以下文章

SAS:使用热键执行 SAS 代码

无法保留嵌套片段

如何重命名SAS中的所有变量?

sas 编程问题 lag 或 retain

关于sas宏的一点想法

sas如何写赋值循环