SAS数组/循环迭代变量

时间:2016-06-20 16:02:59

标签: arrays loops variables sas iteration

这是我第一次在这个论坛上提问。我已经使用SAS / Proc SQL大约4年了,但我不是代码-Jedi所以请给出详细的答案,对于数组来说还是比较新的,所以请原谅我的问题是不是很详细/解释。我一般100%舒适地构建/使用简单数组。但是我有一个非常具体的挑战,我无法弄明白......很难说出来,所以这可能会长篇大论但是这里... ...

为了基本了解我想要实现的目标,它有点类似于简单的贷款摊还,其中第1个月的余额是原始贷款金额,假设为10,000美元,第2个月余额为orig_ln_amt减去任何新的本金/利息支付减去任何额外的付款导致让我们说9500美元,第3个月结果为9000美元等....轻松的1个帐户,但我正在建立一个数组,实际上给出了预测的总剩余余额,当所有活动帐户一起滚动未来一个月,所以我使用的数组每月根据账户的年龄变化。

以下是我希望可以使用的一些示例代码:

DATA SAMPLE;
  SET INPUT_DATA; 'HAS EACH OF THE 3 INPUT ARRAYS LAID OUT SIDE BY SIDE BY SIDE
  ARRAY_ONE {193} ARRAY_ONE1-ARRAY_ONE193; 
  ARRAY_TWO {97} ARRAY_TWO1-ARRAY_TWO97;
  ARRAY_THREE {97} ARRAY_THREE1-ARRAY_THREE97; 
  OUTPUT_ARRAY {193} OUTPUT_ARRAY1-OUTPUT_ARRAY193; 'PORTFOLIO BALANCE EACH FUTURE MONTH
  DO I = 1 TO 193;
    OUTPUT_ARRAY[I] = sum(of ARRAY_ONE[I]-ARRAY_ONE193) - sum(of ARRAY_TWO[I]-ARRAY_TWO97) - sum(of ARRAY_THREE[I]-ARRAY_THREE97);
  END;
RUN;

问题是SAS不喜欢[I [数组计算中的迭代引用]。我也试过和我基于另一个在线用户收到的解决方案似乎是一个类似的问题。逻辑是有道理的,似乎它应该在理论上起作用,但不是......

所以我们必须手动操作和编码193个计算中的每一个:

OUTPUT_ARRAY1 = sum(of ARRAY_ONE1-ARRAY_ONE193) - sum(of ARRAY_TWO1-ARRAY_TWO97) - sum(of ARRAY_THREE1-ARRAY_THREE97);
OUTPUT_ARRAY2 = sum(of ARRAY_ONE2-ARRAY_ONE193) - sum(of ARRAY_TWO2-ARRAY_TWO97) - sum(of ARRAY_THREE2-ARRAY_THREE97);
  ...
OUTPUT_ARRAY97 = sum(of ARRAY_ONE97-ARRAY_ONE193) - sum(of ARRAY_TWO97-ARRAY_TWO97) - sum(of ARRAY_THREE97-ARRAY_THREE97);
OUTPUT_ARRAY98 = sum(of ARRAY_ONE98-ARRAY_ONE193);
  ...
OUTPUT_ARRAY193 = sum(of ARRAY_ONE193-ARRAY_ONE193);

似乎应该有一个简单的解决方案,但我们无法弄明白。提前感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:2)

所以你有三组变量可以调整原理。您有一个起始余额,并且您希望通过应用调整来计算各种中间余额。

首先通过使数组大小相同来简化您的问题。新变量将丢失。如果您确实拥有这些变量但只是不想将它们包含在计算中,那么将它们从输入数据集中删除。请注意,如果您有名为ONE1到ONE193的变量,那么您可以使用此语句array one(193);创建一个名为ONE的数组,该数组使用这些变量。

其次,简化算术以更贴近您的问题描述。在我看来,算法是下一个余额是基于先前的余额减去所有调整。当所有调整都缺少值时,包括零以处理案例。

%let n=193;
data want;
  set have;
  array one (&n);
  array two (&n);
  array three (&n);
  array balance Initial_balance balance1-balance&n;
  do i=1 to dim(balance)-1;
    balance(i+1)=balance(i)-sum(0,one(i),two(i),three(i));
  end;
run;

答案 1 :(得分:1)

编译数据步骤时会计算VAR1-VAR20之类的变量列表。您尝试使用ARRAY[I]-variable193作为变量列表是不会飞的。只需使用另一个DO循环。

DO I = 1 TO dim(output_array);
  output_array(i)=0;
  DO J=I to dim(array_one);
    output_array(i)= sum(output_array(i),array_one(j));
  END;
  DO J=I to dim(array_two);
    output_array(i)= sum(output_array(i),array_two(j));
  END;
  DO J=I to dim(array_three);
    output_array(i)= sum(output_array(i),array_three(j));
  END;
END;