Random 按组分配随机数

Random 按组分配随机数,random,sas,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

我试图给一组中的每个观察值分配一个相同的随机数。因此,在下面的数据集中,变量“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
;

这应该可以解决问题,如果你有任何问题,请问我:

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;

基本上,每次你打电话给拉努尼,你都会得到一个新的随机数,所以你只想在id(gp)改变时打电话给它。

这应该可以解决问题,如果你有任何问题,请问我:

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;

基本上,每次调用Ranui都会得到一个新的随机数,因此您只想在id(gp)更改时调用它。

数据是否按所示的逻辑顺序排列?数据按每个组的id排序。如果使用
Ranui
函数,则更改种子不会更改随机数流。只有
call ranuni
允许您修改流中间数据步骤。在第一行/迭代之后,
seed
调用there绝对不会执行任何操作。数据是否按所示的逻辑顺序排列?数据按每个组的ID排序。如果使用
ranuni
函数,更改seed不会更改随机数流。只有
call ranuni
允许您修改流中间数据步骤。
seed
调用在第一行/迭代之后绝对不会执行任何操作。您应该删除
seed
调用(或将其移出循环),因为它当前除了第一次之外什么都不做。它应该是一个单独的赋值,或者(正确地说,尽管为了简单起见,我有时会跳过它)在
if\n_uu=1
块中。使用gp notsorted的
会有所不同吗?我要求在这种情况下,删除
proc sort
将减少未排序数据集的运行时间。这将起作用。如果你喜欢答案,请勾选复选标记!您应该删除
seed
调用(或将其移出循环),因为它当前除了第一次之外什么都不做。它应该是一个单独的赋值,或者(正确地说,尽管为了简单起见,我有时会跳过它)在
if\n_uu=1
块中。使用gp notsorted
会有所不同吗?我要求在这种情况下,删除
proc sort
将减少未排序数据集的运行时间。这将起作用。如果你喜欢答案,请勾选复选标记!