2017-04-03 24 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 
; 

は愚かIは、各グループに共通の一意の値に基づいてグループごとに異なるシードを作成しようとした:

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'関数を使用している場合、シードを変更すると乱数ストリームが変更されることはありません。 'call 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

'by gp notsorted'を使うと違いがありますか? 'proc sort'を削除すると、ソートされていないデータセットの実行時間が短縮されることがあります。 – user2568648

+0

が動作します。あなたが答えが好きなら、チェックマークをチェックしてください! – DCR

関連する問題