我有一个包含两个变量x
和y
的数据集。 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;
答案 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的几率看起来不同。