首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SAS_Specific Conditional Sum_

SAS_Specific Conditional Sum_
EN

Stack Overflow用户
提问于 2017-03-26 00:36:49
回答 2查看 149关注 0票数 0

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

代码语言:javascript
复制
  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           

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

代码语言:javascript
复制
  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应该等于每组的最大值,并且对于每组的所有观察值都是相同的。在本例中,Group number 1有4个值。它们是10、8、7、10,其中最大值是10,所以第一组B列的观测值都等于10,第二组B列的观测值最大值是13,所以第二组B列的观测值都等于13。

列C更为复杂。它的值取决于所有列。类似于B列,在组内也是一样。更详细地说,它是具体观察量列的总和。这些特定的观测值应该属于每组中具有最大值的观测值。在我们的示例中,第一组为12。原因是,第一组的最大数量是10,属于10的数量是7和5,所以这些的和是12,对于第二组是15,因为第二组的最大值是13,属于13的数量是6和9,所以我希望和是15。我可以解释。在此之前,非常感谢您。

EN

回答 2

Stack Overflow用户

发布于 2017-03-26 00:48:48

您可以使用proc sql实现这一点

代码语言:javascript
复制
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;

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

票数 0
EN

Stack Overflow用户

发布于 2017-03-26 03:50:45

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

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43019001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档