Sas 将一个变量与另外两个变量求平均值

Sas 将一个变量与另外两个变量求平均值,sas,Sas,假设我有以下数据库: DATA have; INPUT id date gain; CARDS; 1 201405 100 2 201504 20 2 201504 30 2 201505 30 2 201505 50 3 201508 200 3 201509 200 3 201509 300 ; RUN; 我想创建一个新表want,其中变量gain的平均值按id和date分组。最终的数据库应如下所示: DATA want; INPUT id date average_gain; CARDS

假设我有以下数据库:

DATA have;
INPUT id date gain;
CARDS;
1 201405 100
2 201504 20
2 201504 30
2 201505 30
2 201505 50
3 201508 200
3 201509 200
3 201509 300
;
RUN;
我想创建一个新表
want
,其中变量
gain
的平均值按
id
date
分组。最终的数据库应如下所示:

DATA want;
INPUT id date average_gain;
CARDS;
1 201405 100
2 201504 25
2 201505 40
3 201508 200
3 201509 250
我尝试使用下面的代码获得所需的结果,但没有成功:

PROC sql;
 CREATE TABLE want as 
 SELECT *,
mean(gain) as average_gain
 FROM have
 GROUP BY id, date
 ORDER BY id, date
 ;
QUIT;

是星号引起了这个问题。这将解析为
id、日期、增益
,这不是您想要的。ANSI SQL不允许这种类型的功能,因此这是SAS与其他SQL实现不同的一种方式。 日志中应该有一个关于重新融合原始数据的注释,这基本上就是正在发生的事情。汇总值将重新合并到每一行

为了避免这种情况,请在查询中按字段列出分组,它将按预期工作

    PROC sql;
    CREATE TABLE want as 
     SELECT id, date,
     mean(gain) as average_gain
     FROM have
     GROUP BY id, date
     ORDER BY id, date
     ;
    QUIT;
我会说,一般来说,PROC MEANS通常是一个更好的选择,因为:

  • 计算多个变量和统计信息,无需多次列出所有变量和统计信息
  • 可以获得多个级别的结果,例如总计、id和组级别的总计
  • 并非所有统计数据都可以在PROC平均值内计算
  • 支持变量列表,因此您可以在没有任何问题的情况下快捷引用长列表