Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays SAS数组/循环迭代变量_Arrays_Loops_Variables_Sas_Iteration - Fatal编程技术网

Arrays SAS数组/循环迭代变量

Arrays SAS数组/循环迭代变量,arrays,loops,variables,sas,iteration,Arrays,Loops,Variables,Sas,Iteration,这是我第一次在这个论坛上提问。我已经使用SAS/Proc SQL大约4年了,但我不是代码绝地武士,所以请给出详细的答案,我对阵列相当陌生,如果我的问题不够详细/解释,请原谅。总体而言,我对构建/使用简单阵列感到100%舒适。但我有一个非常具体的挑战,我无法理解。。。很难用语言表达,所以这可能会说得很长,但接下来 对于我试图完成的基本理解,这有点类似于一个简单的贷款分期偿还,其中第1个月的余额是原始贷款金额,比如10000美元,第2个月的余额是原始贷款金额减去任何新的本金/利息付款减去任何额外付款

这是我第一次在这个论坛上提问。我已经使用SAS/Proc SQL大约4年了,但我不是代码绝地武士,所以请给出详细的答案,我对阵列相当陌生,如果我的问题不够详细/解释,请原谅。总体而言,我对构建/使用简单阵列感到100%舒适。但我有一个非常具体的挑战,我无法理解。。。很难用语言表达,所以这可能会说得很长,但接下来

对于我试图完成的基本理解,这有点类似于一个简单的贷款分期偿还,其中第1个月的余额是原始贷款金额,比如10000美元,第2个月的余额是原始贷款金额减去任何新的本金/利息付款减去任何额外付款,比如9500美元,第三个月的收入为9000美元等。。。。对于一个账户来说很容易,但我正在构建一个数组,当所有活跃账户在未来每个月汇总在一起时,该数组实际上会给出预测的总剩余余额,因此我使用一个数组,该数组的大小会根据账户的年龄每月变化

下面是一些我希望能够工作的示例代码:

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);

似乎应该有一个简单的解决方案,但我们无法找到它。提前感谢大家提供的任何帮助。

编译数据步骤时会计算变量列表,如
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;

在编译数据步骤时,会计算变量列表,如
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;

所以你有三组变量,根据原则进行调整。你有一个起始余额,你想通过应用调整来计算各种中间余额

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

其次,简化你的算法,使之与你的问题描述更接近。在我看来,下一个平衡是基于上一个平衡减去所有调整。包括零,以处理所有调整都缺少值的情况

%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;

所以你有三组变量,根据原则进行调整。你有一个起始余额,你想通过应用调整来计算各种中间余额

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

其次,简化你的算法,使之与你的问题描述更接近。在我看来,下一个平衡是基于上一个平衡减去所有调整。包括零,以处理所有调整都缺少值的情况

%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;

除了回答您的问题之外:我强烈建议您重新格式化数据结构.SAS(以及任何其他非矩阵语言)如果在这里每个时间段有一行,效果会更好。数组中包含什么?余额?利息?不同的月份?为什么长度不同?请发布一段数据。我看到了一个聚合SQL查询解决方案。好问题…回答起来有点难,因为我的贷款分期付款示例不是一个完美的比较,它有点难细节不清楚。产出=剩余余额(支出193个月);Array1=总损失美元(193个月);Array2=支出(97个月);Array3=定期付款(97个月)。数组的长度不同,因为在投资组合的整个生命周期中还有其他事件发生……这与回答您的问题不同:我强烈建议您重新格式化您的数据结构。SAS(以及任何其他非矩阵语言)如果在这里每个时间段有一行,效果会更好。数组中包含什么?余额?利息?不同的月份?为什么长度不同?请发布一段数据。我看到了一个聚合SQL查询解决方案。好问题…回答起来有点难,因为我的贷款分期付款示例不是一个完美的比较,它有点难细节不清楚。产出=剩余余额(支出193个月);Array1=总损失美元(193个月);Array2=支出(97个月);Array3=定期付款(97个月)。数组的长度不同,因为在投资组合的生命周期中会发生其他事件…您可能仍然希望检查数组2/3的DIM,因为它们比数组1短。因此,每个输入数组都有单独的do循环。无法使此双循环逻辑工作,但我想我可能已经解决了。output_array1=&begin_bal;Doi=2到85;output_array[i]=output_array[i-1]-((数组_one[i-1])+(数组_two[i-1])之和+(数组_two[i-1])之和;Doi=86到97;output_array[i]=output_array[i-1]-((数组_one[i-1]之和)+(数组_two[i-1]))+(数组_two[i])之和);Doi=98到193;output_array[i]=