【问题标题】:Assign random number by group按组分配随机数
【发布时间】:2017-04-03 12:05:36
【问题描述】:

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

【问题讨论】:

  • 数据的逻辑顺序是否如图所示?
  • 数据按照每个组的ID排序。
  • 如果您使用ranuni 函数,更改种子不会更改随机数流。只有call ranuni 允许您修改流中间数据步骤。在第一行/迭代之后,seed 调用绝对没有任何作用。

标签: random sas


【解决方案1】:

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

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

【讨论】:

  • 您应该删除seed 调用(或将其移出循环),因为它目前除了第一次之外没有做任何事情。它应该只是一个单独的分配,或者(正确地,虽然我有时会为了简单起见跳过这个)在 if _n_ = 1 块中。
  • 使用by gp notsorted 会有所作为吗?我问的是删除proc sort会减少未排序数据集的运行时间。
  • 那行得通。如果你喜欢这个答案,请检查复选标记!
猜你喜欢
  • 2014-12-29
  • 1970-01-01
  • 2016-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 2023-04-04
  • 1970-01-01
相关资源
最近更新 更多