产品由两组SAS

问题描述

我正在尝试按以下两组创建产品:id1id2

数据集如下所示:

data test;
    input id1 id2 value;
    datalines;

1 199001 1.762681948
1 199001 1.775245162
1 199001 1.428673376
1 199002 1.175974146
1 199002 1.236166022
1 199002 1.608842974
1 199003 1.673956674
1 199003 1.05879051
1 199003 1.565500916
2 199002 1.838999925
2 199002 .
2 199002 1.984415322
2 199003 1.096820927
2 199003 1.734215557
2 199003 1.157566337
;
run;

我想根据第一列和第二列创建最后一列 value 的产品。 IE。组 id1=1id2=199001输出应该是:1.7626x1.7775x1.429=4.47。即输出应如下所示:

1   199001  4.47059416
1   199002  2.338773875
1   199003  2.774645982
2   199002  .
2   199003  2.201834613

解决方法

这是 SAS 中最佳三元组的完美示例:first./last.retain 和按组处理。

data want;
    set test;
    by id1 id2;
    retain product;

    if(first.id2) then product = value;
        else product = product * value;

    if(last.id2) then output;
run;
,

如果您使用值的 LOG(),您可以使用乘法转换为加法的事实。那么就可以使用SQL的SUM()聚合函数了。

proc sql ;
create table want as
  select id1,id2,exp(sum(log(value))) as product
  from have
  group by 1,2
;
quit;

如果我们需要存在缺失值才能返回缺失值,则添加 CASE 语句。您可能还想添加处理零的逻辑。

create table want as
  select id1,case
           when (sum(value=0)) then 0
           when (sum(missing(value))) then .
           else exp(sum(log(case when (value) then value else 1 end)))
         end as product
  from have
  group by 1,2
;

内部 CASE 将消除关于尝试取零或缺失值的 LOG() 的注释。

该代码使用 SAS 布尔逻辑为真生成 1,为假生成零的事实,并将零值或缺失值评估为假,任何其他值都被视为真。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...