【问题标题】:How to retain calculated values between rows when calculating running totals?计算运行总计时如何在行之间保留计算值?
【发布时间】:2017-01-23 05:54:49
【问题描述】:

我对 SAS 中的条件和有一个棘手的问题。实际上,这对我来说很复杂,因此我无法用语言来解释。因此我想举个例子:

 A      B
 5      3
 7      2
 8      6
 6      4
 9      5
 8      2
 3      1
 4      3

如您所见,我有一个包含两列的数据表。首先,我计算了A列的条件累积和(我可以自己做-所以这一步不需要帮助):

 A      B    CA
 5      3    5
 7      2    12
 8      6    18    
 6      4    8     ((12+8)-18)+6
 9      5    17   
 8      2    18
 3      1    10    (((17+8)-18)+3
 4      3    14    

所以我的条件值为18。如果累积超过18,那么它等于18,如果18之后的第一个值的总和超过18的数量,则等于18和下一个值。(我说过我可以自己做) 所以棘手的部分是我必须根据A列计算B列的累积和:

 A      B    CA    CB
 5      3    5     3
 7      2    12    5
 8      6    18    9.5 (5+(6*((18-12)/8)))
 6      4    8     5.5 ((5+6)-9.5)+4
 9      5    17    10.5 (5.5+5)
 8      2    18    10.75 (10.5+(2*((18-7)/8)))
 3      1    10    2.75 ((10.5+2)-10.75)+1
 4      3    14    5.75 (2.75+3)

从示例中可以看出,B 列的累积总和非常具体。当 CA 列等于我们的条件值(18)时,我们计算最后一个值的比例以获得我们的条件值(18),然后用这个比例计算 B 列的累积和。

【问题讨论】:

    标签: sas


    【解决方案1】:

    看起来当 A 的总和达到 18 或更多时,您希望在当前记录和下一条记录之间拆分 A 和 B 的值。一种方法是记住 A 和 B 的剩余值,并将它们带到新的累积变量中。只需确保在重置这些变量之前输出观察结果。

    data want ;
      set have ;
      ca+a;
      cb+b;
      if ca >= 18 then do;
        extra_a=ca - 18;
        extra_b=b - b*((a - extra_a)/a) ;
        ca=18;
        cb=cb-extra_b ;
      end;
      output;
      if ca=18 then do;
        ca=extra_a;
        cb=extra_b;
      end;
      drop extra_a extra_b ;
    run;
    

    【讨论】:

      猜你喜欢
      • 2017-10-04
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2014-07-13
      • 2012-07-03
      • 2010-10-14
      • 1970-01-01
      相关资源
      最近更新 更多