按组分配随机数

时间:2017-04-03 12:05:36

标签: random sas

我正在尝试为组内的每个观察分配相同的随机数。因此,在下面的数据集中,变量" random"对于gp = B的每个观测值都是相等的,并且对于gp = A的每个观测值将采用另一个值,依此类推。

data test ;
input gp $ a b c ;
datalines;
B 2 2 3
B 2 2 3
A 1 2 3
A 1 2 3
C 3 3 4
C 3 3 4
;

我愚蠢地尝试根据每个群组的共同唯一值为每个群组创建不同的种子:

data test2 ;
set test ;

seed = a*b*c ;
random = ranuni(seed) ;

run ;

这会为每个组创建一个共同的起点,但每次观察时都会发生变化。

如何获得组中每个观察的等效随机数?由于真实数据集的大小非常大,我希望避免任何排序或其他耗时的过程。

所需的数据集看起来像是:

data want ;
input gp $ a b c random ;
datalines;
B 2 2 3 0.123
B 2 2 3 0.123
A 1 2 3 0.456
A 1 2 3 0.456
C 3 3 4 0.789
C 3 3 4 0.789
;

1 个答案:

答案 0 :(得分:2)

这应该可以解决问题,问我是否有任何问题:

proc sort data=test;
by gp;
run;

data test2;
drop seed;
set test;
by gp;
retain random;
if first.gp then do;
  seed = a*b*c ;
  random = ranuni(seed) ;
end;
run;

基本上,每次调用ranuni时都会得到一个新的随机数,所以你只想在id(gp)改变时调用它。