我有一个包含5个组的数据集,我想在SAS中使用DS2程序同时计算组均值。
模拟数据集:
data sim;
call streaminit(7);
do group = 1 to 5;
do pt = 1 to 500;
x = rand('ERLANG', group);
output;
end;
end;
run;
我认为它的工作原理是5个线程中的每个线程都接收对应于特定组的数据子集。 x
的均值计算在每个子集上,如下所示:
proc ds2;
thread t / overwrite=yes;
dcl double n sum mean;
method init();
n = 0;
sum = 0;
mean = .;
end;
method run();
set sim; /* Or perhaps a subsetted dataset */
sum + x;
n + 1;
end;
method term();
mean = sum / n;
output;
end;
endthread;
...
quit;
问题是,如果你调用一个处理如下数据集的线程,那么所有行都会被无条件地发送到5个线程(即无论组如何)。
data test / overwrite=yes;
dcl thread t t_instance;
method run();
set from t_instance threads=5;
end;
enddata;
如何告诉SAS按group
对数据进行子集化并将每个子集传递给自己的线程?
答案 0 :(得分:3)
我相信您必须在by
方法中添加run()
语句,然后添加一些代码来处理分组(即,如果您希望它为{{1}输出然后添加代码来执行此操作并清除总计)。 DS2应该是智能的,每个last.group
组使用一个线程(或者,至少每个线程处理一个整个by
组)。如果您从磁盘读取(因为线程优势可能小于磁盘读取时间),我不确定您是否会看到很大改进但是谁知道。
下面的唯一更改是by
,并添加run()
来检查自己。
proc means