【问题标题】:SAS sum by group and then create new variable for each groupSAS 按组求和,然后为每个组创建新变量
【发布时间】:2020-04-16 00:10:51
【问题描述】:

我想对每个组进行求和,并为每个组的总和创建一个新变量。我尝试了 proc sql,但它只创建了一个新变量。 我的数据集如下所示:

data have;
input firm year product$ value;
datalines;
1 2012 a 5
1 2012 a 6
1 2012 b 3
1 2013 a 4
1 2013 a 3
1 2013 b 4
1 2013 b 3
2 2012 a 5
2 2012 a 6
2 2012 b 3
2 2012 b 4
2 2012 b 2
2 2013 a 4
2 2013 a 5
2 2013 b 3
2 2013 b 3
;
run;

我想要的是一个有四列的表:公司年份 productA_sum productB_sum。

我试过这样:

proc sql;
create table h.want as
select a.*, sum(a.value) as sumvalue
from h.have as a
group by firm, year, product;
quit;

但它只会创建一个新列。

【问题讨论】:

  • 如果您不想要所有原始数据,则不要包含既不是分组键也不是聚合函数的变量。当您这样做时,SAS 必须将聚合值重新合并到所有原始观察值上,以便能够返回这些变量的所有值。您的查询在输出中包含 VALUE.。

标签: sas


【解决方案1】:

因为你将三个变量分组,但在选择中,你选择了所有变量。这将导致按功能分组。

/*Try this one*/     
proc sql;
    create table h.want as
    select a.firm, a.year, a.product, sum(a.value) as sumvalue
    from h.have as a
    group by firm, year, product;
    quit;

【讨论】:

    【解决方案2】:

    要根据另一个变量的值获得单独的 SUM() 结果,您需要使用 CASE 语句,而不是将其包含在分组变量中。

    proc sql;
    create table want as
      select firm, year
           , sum(case when (product='a') then value else . end) as sum_product_A
           , sum(case when (product='b') then value else . end) as sum_product_B
      from have
      group by firm,year
    ;
    quit;
    

    如果您希望总和为零而不是在产品从未出现的情况下丢失,则将 else 子句中的缺失值替换为 0。

    【讨论】:

      【解决方案3】:

      您正在旋转总和。如果要处理两个以上的产品价值,则两步法可能更可取。

      proc summary data=have nway noprint;
        class firm year product;
        var value;
        output out=class_sums sum=sum;
      run;
      
      proc transpose data=sums suffix=_sum out=want(drop=_name_);
        by firm year;
        id product;
        var sum;
      run;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-22
        • 2018-01-20
        相关资源
        最近更新 更多