SAS:直到循环和丢弃观察

时间:2014-12-29 20:42:45

标签: arrays loops sas

我的数据集包含以下变量:

实际
预计

首先,我想创建一个新变量'Ratio'= sum(Actual)/ sum(Expected)。对于第一次观察,我希望此表达式包含Actual和Expected的所有值。对于第二次迭代,我想仅使用第二次观察重复此表达式。然后,对于第三次迭代,我想要包括第三次观察以及之后的观察。

这是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)  

其次,数据集可以有任意数量的观察,所以我希望表达式继续,直到'Ratio'低于我手动指定的值。理想情况下,该程序还将包含第四个变量的创建,其中从表达式中排除的观察数量。因此,对于第一次观察,它将是'0',第二次观察'1',第三次观察'2',依此类推。

我认为这也需要一个数组?提前谢谢。

1 个答案:

答案 0 :(得分:0)

您要求为您编写代码,这不是主题(而不是请求您编写代码的帮助);但是,就技术而言,你的确有一个有趣的问题;我将解释这种技巧,如果你需要技巧方面的帮助,请调整你的问题或者问一个新问题。

如果可能,您要在此处执行的操作是对数据进行反向排序。如果它没有任何可以排序的东西,你可以添加一个观察计数器:

data temp;
  set have;
  obs=_n_;
run;

或者您可以使用POINT对数据集进行反向排序,尽管这有点慢。这是后一种技术的基本形式 - 如果你可以反向排序,那么你不需要do循环或设置选项。

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;

从这里你应该能够解决你的其余问题。你当然必须在之后通过适当的排序方法重新排序。