我有一个简单的客户数据集(约40,000k) 它看起来像:
customerid, group, other_variable
a,blue,y
b,blue,x
c,blue,z
d,green,y
e,green,d
f,green,r
g,green,e
我想随机选择每个组,Y量的客户(以及他们的其他变量)。 问题是,我希望每组有两个随机选择的Y量 即
4000 random green customers split into two sets of 2000 randomly
and 4000 random blue customers split into two sets of 2000 randomly
这是因为我有两个不同的消息给两个不同的分裂 我没有替换样品。需要成为独特的客户
更喜欢PROC SQL中的解决方案,但如果proc sql不是
,那么我很乐意在sas中使用替代解决方案答案 0 :(得分:4)
proc surveyselect
是SAS中随机抽样的首选工具。代码非常简单,我只会对每组中的4000个进行采样,然后每2000行分配一个新的子组,因为无论如何数据都是随机顺序(尽管按组排序)。
proc surveyselect
的默认抽样方法是srs
,这是一种简单的随机抽样,无需替换,完全符合此要求。
这是一些示例代码。
/* create dummy dataset */
data have;
do customerid = 1 to 10000;
length group other_variable $8;
if rand('uniform')<0.5 then group = 'blue'; /* assign blue or green with equal likelihood */
else group = 'green';
other_variable = byte(97+(floor((1+122-97)*rand('uniform')))); /* random letter between a and z */
output;
end;
run;
/* dataset must be sorted by group variable */
proc sort data=have;
by group;
run;
/* extract random sample of 4000 from each group */
proc surveyselect data=have
out=want
n=4000
seed=12345; /* specify seed to enable results to be reproduced */
strata group; /* set grouping variable */
run;
/* assign a new subgroup for every 2000 rows */
data want;
set want;
sub=int((_n_-1)/2000)+1;
run;
答案 1 :(得分:0)
data custgroup ;
do i=1 to nobs;
set sorted_data nobs=nobs ;
point = ranuni(0);
end;
proc sort data = custgroup out=sortedcust
by group point;
run;
data final;
set sortedcust;
by group point;
if first group then i=1;
i+1;
run;
基本上我所做的是首先为数据集中的所有观察值分配一个随机数。然后根据变量group
和point
执行排序。
现在我在小组内实现了一个随机的观察序列。 i=1
和i+1
将识别组内的观察行。这意味着将避免提取重复的观察结果。还可以使用output
语句控制基于i.
我的方法可能不是最有效的方法。
答案 2 :(得分:0)
下面的代码应该这样做。首先,您需要生成一个随机数。正如Joe上面所说,最好用特定的数字播种它,以便你可以在必要时重现样本。然后你可以使用带有outobs语句的Proc Sql来生成一个样本。
(顺便说一句,最好不要命名变量&#39; group&#39;。)
data YourDataSet;
set YourDataSet;
myrandomnumber = ranuni(123);
run;
proc sql outobs=2000;
create table bluesample as
select *
from YourDataSet
where group eq 'blue'
order by myrandomnumber;
quit;
proc sql outobs=2000;
create table greensample as
select *
from YourDataSet
where group eq 'green'
order by myrandomnumber;
quit;