所以我想知道是否有办法在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;
有更简单的方法吗?
答案 0 :(得分:0)
有很多方法可以做到这一点,但我不一定会说有一种真正简单的方法。这当然是“SAS”这样做的方式,并不是那么复杂或耗时。
如果您不介意作弊,可以在一个SQL步骤中执行此操作。
proc sql;
create table want as
select *, sum(volume) as volumesum
from have
group by hour;
quit;
这在大多数SQL风格中都是非法的,但SAS将其转换为自动连接(即,它通过正确地计算总和,然后将其连接回原始记录级表)。这与你上面所做的并没有什么不同;它可能会快一点(因为你实际上只读过一次数据),或者它可能会慢一些(因为PROC MEANS
以PROC 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设置)。