根据SAS中变量唯一值的SRS获取数据集的子集

时间:2014-09-24 19:58:55

标签: sas sampling

我有一个包含两个变量xy的数据集。 x有四个不同的值1,2,3和4.我想首先从这4个唯一值中取一个大小为2的简单随机样本并保留相应的行。

说,我得到1,2的SRS,然后我将前7行保留为新的数据集。如果我获得2和3的SRS,那么我将保持第五到第八行。这是一个简单的例子。谢谢。

data dataone;
  input x y;
  datalines;
  1 3
  1 4
  1 5
  1 8
  2 3
  2 7
  2 9
  3 2
  4 8
  4 5
  ;
run;

1 个答案:

答案 0 :(得分:1)

您可以通过以下两种方式之一完成此任务。

PROC SURVEYSELECT将为您完成工作,如果您分两步完成:首先给它一个只有X个唯一值的数据集,然后合并到另一个包含所有值的数据集。

或者,您可以在datastep中执行此操作,首先确定是否要获取该X值,然后选择/不获取行。

data want;
  set have;
  by x;
  call streaminit(7);
  retain need 2; *need 2 total;
  retain have 4; *have 4 total - this could be determined programatically.;
  retain keep;  *and these three could all be one retain statement, this is just more readable;
  if first.x then do;
    if need/have ge rand('Uniform') then keep=1;
    else keep=0;
    need + -keep;
    have + -1;
    put need= have= _t=;
  end;
  if keep;
run;

这是Reservoir Sampling的修改形式。它可以得到相同的SRS结果,即使采用任何一个X的几率看起来不同。