通过选项在SAS中生成变量

时间:2014-06-18 13:09:00

标签: variables sas stata

所以我想知道是否有办法在SAS中基本复制egen选项。现在,我试图通过某个组找到变量的平均值,因此我使用proc均值功能并输出包含该信息的数据集。然后我将该数据集与我在proc手段功能中使用的数据集合并。我想知道是否有更简单的方法可以做到这一点。

所以这就是我的工作

proc means dataset=data noprint; 
var volume;
class hour;
output out=newdataset sum(volume)=sumvolume;
run; 

然后我使用左连接与名为data

的原始数据集合并
proc sql; 
select a.*,b.sumvolume
from data as a
left join newdataset as b
on a.hour=b.hour;
quit; 

有更简单的方法吗?

1 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点,但我不一定会说有一种真正简单的方法。这当然是“SAS”这样做的方式,并不是那么复杂或耗时。

如果您不介意作弊,可以在一个SQL步骤中执行此操作。

proc sql; 
 create table want as
  select *, sum(volume) as volumesum
  from have
  group by hour;
quit;

这在大多数SQL风格中都是非法的,但SAS将其转换为自动连接(即,它通过正确地计算总和,然后将其连接回原始记录级表)。这与你上面所做的并没有什么不同;它可能会快一点(因为你实际上只读过一次数据),或者它可能会慢一些(因为PROC MEANSPROC SQL不可能的方式进行优化),但我怀疑它们整体表现会相似(但要测试它们!)。

您可以在datastep中执行平均值,但实际上它并不是真正根本不同:计算平均值的步骤,以及将数据反馈回数据的步骤。

data want;
do _n_ = 1 by 1 until (last.hour);
  set have;
  by hour;
  volumesum + volume;
end;
do _n_=1 by 1 until (last.hour);
  set have;
  by hour;
  output;
end;
volumesum=0;
run;

这也可能会一次读取数据(只要按小时划分的组数不会太大而不适合您的BUFSIZE / BUFNO设置)。