【发布时间】:2015-02-03 19:10:48
【问题描述】:
我有一个包含 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 对数据进行子集化并将每个子集传递给它自己的线程?
【问题讨论】:
-
从 the documentation 看来您需要一个
by语句来指定分组。进一步讨论here。但是,从我的肤浅阅读来看,这是否仅与数据库处理有关。 -
@SRSwift:我熟悉 BY 组处理,并且针对这种情况进行了研究。我假设我需要在某处使用
by语句,但我无法弄清楚如何使用它为每个组生成一个线程。 -
我无权访问 DS2,但我假设它遵循基本 SAS 中的
set语句。见here。 -
@SRSwift:我知道一般如何使用
by语句。它确实低于set,就像在数据步骤中一样。我的问题是利用组来完成特定任务。我搜索了 SAS DS2 文档,但没有找到与我的需求直接相关的内容,这就是我发布到 SO 的原因。 -
sas-ds2 标签已创建 - 请随时改进 wiki。
标签: multithreading parallel-processing sas sas-ds2