2017-04-03 154 views
0

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

这产生每组一个共同的起点,但显然对于每个观测改变。

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

所需datset看起来是这样的:

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 
; 
+0

数据是否按所示逻辑顺序显示? – Reeza

+0

数据按每个组的ID排序。 – user2568648

+1

如果你使用'ranuni'函数,更改种子并不会改变随机数字流。只有'调用ranuni'可以让你修改数据流中间步骤。那里的'seed'调用在第一行/迭代之后完全没有。 – Joe

回答

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)改变时调用它。

+1

您应该删除'seed'调用(或将其移出循环),因为除第一次以外,它现在没有任何操作。它应该是一个单独的赋值,或者(正确地说,尽管我有时候为了简单而忽略了这个)在一个'if _n_ = 1'块中。 – Joe

+0

会使用'通过gp notsorted'有所作为吗?我想问一下,删除'proc sort'会减少未排序的数据集上的运行时间。 – user2568648

+0

这将工作。如果你喜欢答案,请检查复选标记! – DCR