Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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_Sas - Fatal编程技术网

Arrays SAS:直到循环和下降观察

Arrays SAS:直到循环和下降观察,arrays,loops,sas,Arrays,Loops,Sas,我的数据集具有以下变量: 实际值 期望 首先,我想创建一个新变量“Ratio”=sum(实际)/sum(预期)。对于第一个观察,我希望这个表达式包括实际值和预期值的所有值。对于第二次迭代,我只想使用第二次观察和以后的结果重复这个表达式。然后对于第三次迭代,我想包括第三次观察和以后的观察 这是数据和公式的一个示例,它将在Excel中显示 actual expected ratio 15 33 =SUM(A2:$A$6)/SUM(B2:$B$6) 10

我的数据集具有以下变量:

实际值
期望

首先,我想创建一个新变量“Ratio”=sum(实际)/sum(预期)。对于第一个观察,我希望这个表达式包括实际值和预期值的所有值。对于第二次迭代,我只想使用第二次观察和以后的结果重复这个表达式。然后对于第三次迭代,我想包括第三次观察和以后的观察

这是数据和公式的一个示例,它将在Excel中显示

actual  expected    ratio  
15      33          =SUM(A2:$A$6)/SUM(B2:$B$6)  
10      50          =SUM(A3:$A$6)/SUM(B3:$B$6)  
20      64          =SUM(A4:$A$6)/SUM(B4:$B$6)  
60      77          =SUM(A5:$A$6)/SUM(B5:$B$6)  
45      81          =SUM(A6:$A$6)/SUM(B6:$B$6)  
其次,数据集可以有任意数量的观察值,因此我希望表达式继续,直到“比率”低于我手动指定的值。理想情况下,该程序还将包含第四个变量的创建,该变量的观测值数量将从表达式中排除。因此,对于第一个观测值,它将是“0”,第二个观测值是“1”,第三个观测值是“2”,依此类推


我想这也需要一个数组?提前感谢。

您要求为自己编写代码,这是离题的(而不是要求帮助编写代码);然而,就技术而言,你确实有一个有趣的问题;我会解释这个技巧,如果你需要技巧方面的帮助,调整你的问题或者问一个新问题

如果可能的话,您希望在这里对数据进行反向排序。如果没有任何排序依据,您可以添加观察计数器:

data temp;
  set have;
  obs=_n_;
run;
或者,您可以使用点来反转数据集的顺序,尽管这稍微慢一些。这是后一种技术的基本形式——如果可以反向排序,则不需要do循环或set选项

data want;
  do obsnum = nobs to 1 by -1;
    set have nobs=nobs point=obsnum;
    act_sum+actual;   *accumulator for actual;
    exp_sum+expected; *accumulator for expected;
    ratio=act_sum/exp_sum;
  end;
run;

从这里你应该能够解决你的问题的其余部分。当然,之后您必须使用正确的排序方法重新排序。

谢谢。我没有发布我的代码,因为我担心我采取了错误的方法。我将用您在脑海中描述的技巧再试一次。@kjay总是发布您的代码。请求代码方面的帮助是可以的,但请求从头开始的代码则不行。