【发布时间】:2016-06-20 16:02:58
【问题描述】:
这是我第一次在这个论坛上提问。我已经使用 SAS/Proc SQL 大约 4 年了,但我不是代码绝地,所以请给出详细的答案,并且对数组相当陌生,所以如果我的问题没有详细/解释,请原谅。一般来说,我对构建/使用简单的数组感到 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[ 迭代引用。我也尝试过 &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);
似乎应该有一个简单的解决方案,但我们无法弄清楚。提前感谢大家可以提供的任何帮助。
【问题讨论】:
-
与回答您的问题分开:我会强烈鼓励您重新制定数据结构。如果您在此处每个时间段有一行,则 SAS(和任何其他非矩阵语言)会远远做得更好。
-
数组中包含什么?余额?兴趣?不同月份?为什么长度不一样?请发布数据的sn-p。我看到了一个聚合 SQL 查询解决方案。
-
好问题...有点难以回答,因为我的贷款摊销示例不是一个完美的比较,而且在细节上有点混乱。输出 = 剩余余额(输出 193 个月); Array1 = 总损失 $ (193mos); Array2 = 收益(97mos); Array3 = 定期付款 (97mos)。数组的长度不同,因为在投资组合的生命周期中还会发生其他事件...
标签: arrays loops variables sas iteration