SAS_Specific条件Sum_

时间:2017-03-25 16:36:49

标签: sas

我对SAS编程有疑问。这是有条件的和。但这对我来说非常具体。因此,我想问一个例子。我有以下数据集:

  Group         A      Quantity             
    1          10          7           
    1          8           4           
    1          7           3           
    1          10          5           
    2          11          6           
    2          13          8           
    2          9           7           
    2          13          9           

我想在此数据集中再添加两列。新数据集应为:

  Group         A      Quantity         B     NewColumn    
    1          10          7           10         12  (7+5)
    1          8           4           10         12
    1          7           3           10         12
    1          10          5           10         12
    2          13          6           13         15   (6+9)        
    2          10          8           13         15
    2          9           7           13         15
    2          13          9           13         15

因此,B列应该等于每组的最大值,并且对于每组的所有观察结果都是相同的。在此示例中,组号1具有4个值。它们是10,8,7,10。这些值中的最大值是10.因此,第一组的B列的观察值都等于10.第2组的最大数量是13.因此,第二组B列的观察值均等于13。

C列更复杂。它的值取决于所有列。与B列类似,它在组内是相同的。更详细,它是QUANTITIES列的具体观察的总和。这些具体观察结果应属于每组中具有最大值的观察结果。在我们的例子中,第一组是12。原因是,第一组的最大数量是10.而属于10的数量是7和5.因此,这些的总和是12.对于第二组,它是15.因为第二组的最大值是13和属于13的数量是6和9.所以总和是15。 我希望。我可以解释一下。提前谢谢了。

2 个答案:

答案 0 :(得分:0)

您可以使用proc sql

执行此操作
proc sql;
    select t.*, max_a as b,
           (select sum(t2.quantity)
            from t t2
            where t2.group = t.group and t.a = max_a
           ) as c
    from t join
         (select group, max(a) as max_a
          from t
          group by group
         ) g
         on t.group = g.group;
run;

如果数据来自底层数据库,大多数数据库都支持窗口函数,这使得这更容易。

答案 1 :(得分:0)

这是未经测试的(我远离sas)并且可能会有错误,但是三重DoW循环应该可以工作。一次获得每组最大值,第二次获得总和,第三次传递输出记录。类似的东西:

data want ;
  do until(last.group) ; 
    by group ;
    set have ;
    B=max(A,B) ;
  end ;

  do until(last.group) ;
    set have ;
    by group ;
    if A = B then NewColumn = sum(NewColumn, Quantity) ;
  end;

  do until(last.group);
    set have ;
    by group;
    output ;
  end ;
run;