我的数据集包含以下变量:
实际
预计
首先,我想创建一个新变量'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',依此类推。
我认为这也需要一个数组?提前谢谢。
答案 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;
从这里你应该能够解决你的其余问题。你当然必须在之后通过适当的排序方法重新排序。