如何在计算运行总计时保留行之间的计算值?

时间:2017-01-22 10:50:52

标签: sas

我对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的数量。(正如我所说,我可以自己做) 因此,棘手的部分是我必须根据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的累积和。

1 个答案:

答案 0 :(得分:3)

当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;