2017-04-03 203 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