【问题标题】:SAS: Do until loop and dropping observationsSAS:做直到循环并放弃观察
【发布时间】:2014-12-29 20:42:45
【问题描述】:

我的数据集有以下变量:

实际
预计

首先,我想创建一个新变量'Ratio' = sum(Actual)/sum(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)  

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

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

【问题讨论】:

    标签: arrays loops sas


    【解决方案1】:

    您要求为您编写代码,这是题外话(而不是就您编写的代码寻求帮助);但是,就技术而言,您确实有一个有趣的问题;我将解释该技术,如果您需要有关该技术的帮助,请调整您的问题或提出新问题。

    如果可能,您需要在此处对数据进行反向排序。如果它没有任何排序依据,您可以添加一个观察计数器:

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

    或者您可以使用 POINT 对数据集进行反向排序,尽管这会慢一些。这是后一种技术的基本形式——如果你可以反向排序,那么你就不需要 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 总是发布你的代码。寻求代码方面的帮助是可以的,但从头开始寻求代码是不行的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 2018-01-29
    • 2014-05-14
    相关资源
    最近更新 更多